Cyb*_*fox 7 elasticsearch kibana kibana-4
我有一个带Kibana的ElasticSearch实例,它拥有我在几年内积累的大量用户级应用数据.其中一个字段是用户正在运行的Java版本.
我想随着时间的推移绘制Java版本,所以我可以知道转换到更新版本是否合理.不幸的是,我不能找到一种方法来聚集1.6.0_31,1.6.0_32,1.6.0_37,1.6.0_51作为一个单一的1.6入口,使图形几乎是不可读的现在.
在Kibana中有没有一种方法可以聚合数据,比如我可以编写正则表达式的"脚本字段"?例如simplified_java: osjv % '\d\.\d',哪个被定义simplified_java为osjv字段的一部分,该数字匹配一个数字,后跟一个点后跟一个数字.
目前看起来Kibana只支持数字脚本字段,这使得这很难.我没有使用LogStash,因为我没有真正使用'logs',而是我的桌面应用程序中的自定义事件报告框架(选择加入)报告使用统计信息,所以不幸的是我不能使用它的任何功能.
我可以手动完成它,但我已经导入了2G的事件数据,我不想再这样做了,只为可计算的内容添加一个新字段...... :(
有没有办法在Kibana中创建基于子字符串或正则表达式的字段,或者(失败)告诉ElasticSearch透明地做同样的事情?
小智 0
您绝对可以在 Kibana 中针对 Elasticsearch 中的字符串数据执行脚本化字段,前提是将其映射为类型keyword。请参阅脚本化字段文档以获取少量信息,并参阅脚本化字段博客文章以获取更好的示例。
简而言之,您可以通过构建返回子字符串的脚本化字段来完成您想要的操作:
def version = doc['osjv'].value; return (version != null) ? v.substring(0, v.lastIndexOf(".")-1) : version;
Run Code Online (Sandbox Code Playgroud)
请记住,脚本化字段会对性能产生影响,因为它们在您每次查看时都会运行。
更好的方法可能是在文档中创建一个包含该simplified_java值的新字段。您不需要从源重新提取所有数据,而是可以执行Update By Query。您的查询只是match_all{},然后您可以定义一个创建新字段的脚本。所以是的,索引正在发生,但发生在“原地”:
POST your-index/_update_by_query
{
"script": {
"source": "def version = ctx._source.osjv; ctx._source.simplified_java = (version != null) ? version.substring(0, version.lastIndexOf(".")-1) : version",
"lang": "painless"
},
"query": {
"match_all": {}
}
}
Run Code Online (Sandbox Code Playgroud)
...还没有测试过这些脚本,但看起来像它们!
| 归档时间: |
|
| 查看次数: |
886 次 |
| 最近记录: |