【问题标题】:elasticsearch: extract number from a fieldelasticsearch:从字段中提取数字
【发布时间】:2015-10-07 17:00:37
【问题描述】:

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

例如,有这个:

accountExist 执行时间:1046 毫秒

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

有可能吗?如何? 感谢您的帮助

【问题讨论】:

  • 您对此有答案吗?我也在找一样的
  • 我们使用 logstash 脚本解决了这个问题。使用 grok,您可以做很多事情。

标签: elasticsearch kibana


【解决方案1】:

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

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

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

Analyze API 有助于测试目的。

【讨论】:

  • 如前所述,这必须在索引期间完成,因此要为现有数据添加此内容,您需要重新索引。不错的策略:stackoverflow.com/a/17446500/947986
  • 令人沮丧的是,您必须竭尽全力做一些如此琐碎的事情。 kibana 很难从文本中提取值以进行绘图等是否有某些原因?
  • 假设您想梳理过去一周的日志(10MM 记录),寻找耗时 1 秒以上的请求。在数据库中,您将执行 10MM 行的表扫描,处理正则表达式 10MM 次,然后进行 CAST 和比较......这将需要很长时间!如果您从一开始就将执行时间加载到其自己的(索引)字段中,您将能够在 btree 下几跳(微秒?)中找到记录。 Kibana 依赖于 Elasticsearch 擅长的领域:聚合,而不是繁重的工作。
  • 恐怕这个解决方案行不通。见elastic.co/guide/en/elasticsearch/reference/current/…It is the field value which is copied, not the terms (which result from the analysis process).我测试了它,确实这不起作用,因为值before分析被复制到新字段而不是分析器产生的术语。
  • 你的论点是正确的。必须在目标字段上执行分析(提取数字)。但事后看来,即使您提取数字部分,您也会对目标字段进行“文本”分析,因此最终的“术语”标记将是“文本”类型,而不是预期的数字。过去,我总是在发送要编入索引的记录之前处理这种文本解析。
【解决方案2】:

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

这里介绍:https://www.elastic.co/blog/using-painless-kibana-scripted-fields

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

    script.painless.regex.enabled: true

  • 重启弹性搜索
  • 在 Kibana 中通过 Management -> Index Patterns -> Scripted Fields 创建一个新的脚本字段
  • 语言选择painless,类型选择数字
  • 创建实际脚本,例如:
def logMsg = params['_source']['log_message']; 如果(logMsg == null){ 返回-10000; } def m = /.*accountExist 执行时间:([0-9]+) ms.*$/.matcher(params['_source']['log_message']); 如果 ( m.matches() ) { return Integer.parseInt(m.group(1)) } 别的 { 返回 -10000 }
  • 您必须完全重新加载网站才能执行新字段,只需在打开的发现站点上重新搜索将不会选择新字段。 (这几乎让我放弃了尝试让这个工作 -.-)
  • 在发现或可视化中使用脚本

虽然我明白,为数百万个日志条目编写字段脚本并不高效,但我的用例是一个非常具体的日志条目,每天总共记录 10 次,我只使用生成的字段来创建一个可视化或分析,我提前通过常规查询减少候选人。

如果可以让这些字段仅在您需要它们的情况下计算(或者它们有意义并且可以开始计算;即不需要“返回 -1000”),那将会很有趣。目前,它们将被应用并显示在每个日志条目中。
您可以在这样的查询中生成脚本字段:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-script-fields.html 但这似乎有点过于隐蔽,难以维护:/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    • 2017-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-24
    相关资源
    最近更新 更多