我有一个带有 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,因为我并没有真正使用“日志”,而是我的桌面应用程序中的一个自定义事件报告框架(选择加入)报告使用统计信息,所以不幸的是我不能使用它的任何功能.
我可以手动完成,但我已经导入了 2G 的事件数据,我不想再做一次,只为应该可计算的内容添加一个新字段...:(
有没有一种方法可以在 Kibana 中基于子字符串或正则表达式创建一个字段,或者(如果没有)有一种方法可以告诉 ElasticSearch 透明地做同样的事情?
最佳答案
您绝对可以在 Kibana 中针对 Elasticsearch 中的字符串数据执行脚本化字段,前提是它被映射为 keyword
类型。参见 the scripted field documentation一点点信息,和the scripted field blog post以获得更好的示例。
简而言之,您可以通过构建一个返回子字符串的脚本化字段来完成您正在寻找的事情:
def version = doc['osjv'].value; return (version != null) ? v.substring(0, v.lastIndexOf(".")-1) : version;
请记住,脚本字段会影响性能,因为它们会在您每次查看它们时运行。
更好的方法是在您的文档中创建一个具有 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": {}
}
}
...还没有测试过这些脚本中的任何一个,但看起来像它们!
关于elasticsearch - 如何通过字段的子字符串或正则表达式制作 Kibana 图表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33222293/