我有一个带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 :(得分: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": {}
}
}
...没有测试过任何一个脚本,但看起来像它们!