elasticsearch elasticsearch:从字段中提取数字,elasticsearch,kibana,elasticsearch,Kibana" /> elasticsearch elasticsearch:从字段中提取数字,elasticsearch,kibana,elasticsearch,Kibana" />

elasticsearch elasticsearch:从字段中提取数字

elasticsearch elasticsearch:从字段中提取数字,elasticsearch,kibana,elasticsearch,Kibana,我使用elasticsearch和kibana来存储日志。 现在我想从一个字段中提取一个数字,并将其存储到一个新字段中 例如,有这样一个: accountExist执行时间:1046毫秒 我想提取数字(1046)并在kibana的一个新字段中查看它 可能吗?怎样? 感谢您的帮助您需要在编制索引之前/期间执行此操作 在Elasticsearch中,您可以在索引期间获得所需内容: 使用定义新的分析器来包装正则表达式(出于您的目的,捕获字符串中的连续数字-) 在映射中创建新的数字字段以保存提取的时间

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

例如,有这样一个:

accountExist执行时间:1046毫秒

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

可能吗?怎样?
感谢您的帮助

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

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

  • 使用定义新的分析器来包装正则表达式(出于您的目的,捕获字符串中的连续数字-)
  • 在映射中创建新的数字字段以保存提取的时间
  • 用于将日志消息从输入字段复制到新的数字字段(2),新的分析器将在其中对其进行分析

  • 对于测试目的可能很有帮助。

    虽然没有性能,但如果必须避免重新编制索引,可以在kibana中使用脚本字段

    简介如下:

    • 通过在elasticsearch.yaml中添加以下内容来启用无痛正则表达式支持: script.painless.regex.enabled:true

    • 重新启动elasticsearch
    • 通过管理->索引模式->脚本字段,在Kibana中创建一个新的脚本字段
    • 选择painless作为语言,选择number作为类型
    • 创建实际脚本,例如:
    def logMsg=params[''u source']['log\u message']; 如果(logMsg==null){ 返回-10000; } def m=/.*accountExist执行时间:([0-9]+)ms.*$/.matcher(参数[''u source']['log\u message']); 如果(m.matches()){ 返回整数.parseInt(m.group(1)) }否则{ 返回-10000 }
    • 要执行新字段,您必须完全重新加载网站,只需在打开的发现网站上重新搜索,将无法获取新字段。(这几乎让我放弃了让它工作的努力——。-)
    • 在发现或可视化中使用脚本
    虽然我明白,为数百万个日志条目编写字段是不可行的,但我的用例是一个非常具体的日志条目,每天总共记录10次,我只使用生成的字段来创建可视化或在分析中,通过提前进行常规查询来减少候选项

    如果有可能只在您需要这些字段的情况下计算这些字段(或者这些字段有意义&一开始是可计算的;例如,使“return-1000”变得不必要),那将非常有趣。当前,它们将应用于每个日志条目并显示。

    您可以在查询内部生成脚本字段,如下所示:但这似乎有点太过隐蔽,难以轻松维护://

    如前所述,这必须在索引期间完成,因此要为现有数据添加脚本字段,您需要重新索引。这是一个不错的策略:令人沮丧的是,你不得不走这么长的路,做一些琐碎的事情。kibana很难从文本中提取值以进行绘图等,这有什么原因吗?假设您想梳理过去一周的日志(10MM记录),查找耗时1秒以上的请求。在数据库中,您需要对10MM行进行表扫描,处理一个10 mm的正则表达式,然后进行转换和比较。。。。那要花很长时间!如果您从一开始就将执行时间加载到它自己的(索引的)字段中,您将能够在一个btree(微秒?)中的几跳中找到记录。Kibana依赖于Elasticsearch擅长的东西:聚合,而不是繁重的工作。恐怕这个解决方案行不通。请参见
    复制的是字段值,而不是术语(由分析过程产生)。
    我对其进行了测试,事实上,在将
    分析复制到新字段而不是从分析器产生的术语之前,这将不起作用。您的参数是正确的。必须在目的地字段上执行分析(提取号码)。但事后来看,即使您提取了数字部分,您也会对目标字段进行“文本”分析,因此标记的最终“术语”将是“文本”类型,而不是预期的数字。在过去,我总是在发送要索引的记录之前处理这种文本解析。你对此有答案吗?我在找sameWe用logstash脚本解决了这个问题。有了grok,你可以做很多事情。
    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
    }