elasticsearch:从字段中提取数字

时间:2015-10-07 17:00:37

标签: elasticsearch kibana

我正在使用elasticsearch和kibana来存储我的日志。 现在我想要的是从一个字段中提取一个数字并存储一个新字段。

例如,有这个:

accountExist执行时间:1046 ms

我想提取数字(1046)并在kibana的新字段中查看。

有可能吗?怎么样? 谢谢你的帮助

2 个答案:

答案 0 :(得分:5)

您需要在索引编制之前/期间执行此操作。

在Elasticsearch中,您可以在索引编制期间获得所需内容:

  1. 使用Pattern Analyzer定义一个新的分析器来包装正则表达式(为了您的目的,捕获字符串中的连续数字 - good answer on this topic)。
  2. 在映射中创建新的数字字段以保存提取的时间。
  3. 使用copy_to将日志消息从输入字段复制到新分析器将解析它的(2)中的新数字字段。
  4. Analyze API可能有助于测试目的。

答案 1 :(得分:1)

虽然不具备性能,但如果必须避免重新索引,您可以在kibana中使用脚本字段。

此处简介:https://www.elastic.co/blog/using-painless-kibana-scripted-fields

  • 通过将以下内容放在elasticsearch.yaml中来启用无痛正则表达式支持:
      

    script.painless.regex.enabled:true

  • 重新启动elasticsearch
  • 通过管理在Kibana中创建一个新的脚本字段 - >索引模式 - >脚本字段
  • 选择无痛作为语言和数字作为类型
  • 创建实际脚本,例如:
def logMsg = params['_source']['log_message'];
if(logMsg == null) {
 return -10000;
}
def m = /.*accountExist execution time: ([0-9]+) ms.*$/.matcher(params['_source']['log_message']);
if ( m.matches() ) {
   return Integer.parseInt(m.group(1))
} else {
   return -10000
}
  • 您必须完全重新加载网站才能执行新字段,只需在开放发现网站上重新搜索就不会获取新字段。 (这几乎让我放弃了试图让这个工作 - .-)
  • 在发现或可视化中使用脚本

虽然我理解,对于数百万个日志条目的脚本字段不具备效果,但我的用例是一个非常具体的日志条目,每天记录10次,我只使用结果字段创建一个可视化或分析,我提前通过常规查询减少候选人。

如果有可能只在你需要它们的情况下计算这些字段(或者它们有意义并且可以开始计算,即为了使"返回-1000和#34;不必要)。目前,它们将被应用并显示每个日志条目 你可以在这样的查询中生成脚本化的字段:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-script-fields.html但这似乎有点过于掩盖,以便轻松维护:/