ELK入门——解决:Scripts Fields利用正则表达式提取,m.matches()返回false,无法正确匹配

本文介绍了在Kibana中使用Painless脚本字段进行正则表达式匹配时遇到的问题。作者分享了如何通过调整脚本,从_doc['_id']中提取信息并使用find()函数找到匹配结果,解决了matches()返回false的困境。博客内容包括对Painless语法的探讨、匹配函数的使用以及解决步骤,帮助读者理解并解决类似问题。
摘要由CSDN通过智能技术生成

更多的Scripts Fields具体细节和操作,以及正则表达式请参考博客ELK入门(十六)——Kibana-Painless-Scripts-Fields,对索引字段提取处理,生成新字段

在Kibana创建Scripts Fields后,采用正则表达式想要匹配内容,却无法产生结果。在m=/pattern/.matcher(tset)后,利用m.matches()查看是否正确匹配,却返回false。

很多时候,感觉自己的语法没有问题,理论上应该匹配到结果,但是查看m.matches()返回值为false,刚开始一直找不到头绪。错误示例如下:

显然,在_id中存在大写字母T,正则匹配应该可以查到结果。如果我return path,可以正常显示_id,说明原内容获取无误。

在博客elasticsearch painless最强教程 二中,博主提到painless的语法匹配模式与java相同,而使用过程中也发现许多函数调用都源自java。

在网上查找错误时,一个Java的报错疑难给了我启发(正则表达式Matcher给我挖的坑),他提到除了matches函数,还有find函数也会返回匹配结果,于是在官网查询painless与matches相关的API(https://www.elastic.co/guide/en/elasticsearch/painless/5.5/painless-api-reference.html),发现果然也有find函数,于是用find函数查询,发现返回结果变成了true。

这个是5.5版本的painless参考文档,有点函数大全的感觉。改一下链接的数字可以到7.10版本,但是显示有点不太一样,不太好找

而在这个博主的博客中,他提到了其中的原理,我就不细说(其实是并没有彻底理解),直接说解决方案

将Scripts语句改为:

def path = doc['_id'].value;
if (path != null){
    path = path.toString();
    def m = /T/.matcher(path);
    if (m.find()==true){
        return m.group(0);
    }
}
return "";

这时,如果匹配成功,将会返回匹配到的第一个结果。再看测试结果发现成功生成新字段了

这个问题困扰了我两天(可能是我菜了),一来是官方给出的示例只有m.matches()限制了我的思维,二来网上关于这个的讨论比较少。于是做了一下整理,希望对大家有所帮助。

 

 

参考博客:

elasticsearch painless最强教程 二

正则表达式Matcher给我挖的坑

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值