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

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_javaosjv字段的一部分,该数字匹配一个数字,后跟一个点后跟一个数字.

目前看起来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)

...还没有测试过这些脚本,但看起来像它们!