如何通过字段的子字符串或正则表达式制作 Kibana 图表?

How can I make Kibana graph by a substring or regex of a field?

我有一个带有 Kibana 的 ElasticSearch 实例,其中包含我几年来积累的大量用户级应用程序数据。字段之一是用户 运行.

的 Java 版本

我想绘制 Java 版本随时间变化的图表,这样我就可以知道过渡到较新版本是否合理。不幸的是,我找不到将 1.6.0_311.6.0_321.6.0_371.6.0_51 聚合为单个 1.6 条目的方法,因此该图几乎不可读现在。

Kibana 是否有聚合数据的方法,比如我可以为其编写正则表达式的 'scripted field'?例如。 simplified_java: osjv % '\d\.\d'simplified_java 定义为 osjv 字段的一部分,匹配数字后跟点和数字。

目前看来 Kibana 只支持数字脚本字段,这使得这很难。我没有使用 LogStash,因为我并没有真正使用 'logs',而是我的桌面应用程序中的自定义事件报告框架(选择加入)报告使用统计信息,所以不幸的是我不能使用任何它的特点。

我可以手动完成,但我已经导入了 2G 的事件数据,我不想再做一次,只为应该可计算的内容添加一个新字段...:(

有没有一种方法可以在 Kibana 中创建基于子字符串或正则表达式的字段,或者(如果不能)有一种方法告诉 ElasticSearch 透明地做同样的事情?

您绝对可以在 Kibana 中针对 Elasticsearch 中的字符串数据执行脚本化字段,前提是它被映射为 keyword 类型。有关更好的示例,请参阅 the scripted field documentation for a tiny bit of info, and the scripted field blog post

简而言之,您可以通过构建一个 returns 子字符串

的脚本字段来完成您正在寻找的事情
def version = doc['osjv'].value; return (version != null) ? v.substring(0, v.lastIndexOf(".")-1) : version;

请记住,脚本字段对性能有影响,因为它们 运行 每次您查看它们。

更好的方法是在您的文档中创建一个具有 simplified_java 值的新字段。您不需要从源中重新提取所有数据,而是可以执行 Update By Query。您的查询只是 match_all{} 然后您可以定义一个脚本来创建新字段。所以是的,索引正在发生,但是正在发生 "in place":

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": {}
  }
}

...还没有测试过这些脚本中的任何一个,但看起来像它们!