更多的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()限制了我的思维,二来网上关于这个的讨论比较少。于是做了一下整理,希望对大家有所帮助。
参考博客: