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

时间:2015-10-19 19:25:24

标签: elasticsearch kibana kibana-4

我有一个带Kibana的ElasticSearch实例,它拥有我在几年内积累的大量用户级应用数据。其中一个字段是用户正在运行的Java版本。

我想随着时间的推移绘制Java版本,所以我可以知道转换到更新版本是否合理。很遗憾,我找不到将1.6.0_311.6.0_321.6.0_371.6.0_51汇总为单个1.6条目的方法,因此图表几乎无法读取现在

Kibana有没有办法聚合数据,比如我可以编写正则表达式的'脚本字段'?例如。 simplified_java: osjv % '\d\.\d'simplified_java定义为osjv字段中与数字后跟一个点后跟数字相匹配的部分。

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

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

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

1 个答案:

答案 0 :(得分:0)

您绝对可以在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": {}
  }
}

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