Kibana/Elasticsearch正则表达式查询无结果问题求助
搞定Kibana中Keyword类型字段正则查询失效的问题
嘿,我踩过类似的坑,给你几个靠谱的排查和解决方向,帮你搞定这个正则查询的问题!
首先得明确核心:你的message字段是keyword类型,这类字段在Elasticsearch里是原封不动存储的字符串,不像text类型会被分词处理,所以正则查询的玩法和text字段不一样,得注意细节。
1. 先确认你用对了Kibana的查询姿势
Kibana Discover界面默认的搜索框是Lucene语法,但针对keyword字段的正则,得用正确的写法:
- 直接在搜索框输入的话,要带上字段名,然后用
/正则表达式/包裹,比如要匹配开头那段syslog内容的话:
划重点:日志里的message:/<14>1 2018-05-02T13:53:48\.079000Z snrvro04 vco.*/.是字面量,在正则里要转义成\.,不然会被当成“匹配任意字符”来处理。 - 嫌手写麻烦的话,用Kibana的可视化查询编辑器:选
message字段,然后挑“正则表达式”选项,输入你的模式就行,它会帮你处理语法细节。
2. 检查正则语法是否符合Lucene规则
Elasticsearch用的是Lucene的正则实现,有几个限制要注意:
- 不支持lookaround断言(比如正向预查、反向预查这种花活),老老实实写基础正则就行
- 尽量别用
.*开头的正则,数据量大的话会拖慢查询速度,能从固定前缀开始写就从前缀开始 - 特殊字符比如
+、*、?这些是正则元字符,如果要匹配它们的字面量,才需要转义,其他情况正常写就行
3. 先验证字段内容是不是你以为的那样
有时候Logstash解析可能会偷偷截断或者加了额外空格,导致正则匹配不上。先做个精确匹配测试:
message:"<14>1 2018-05-02T13:53:48.079000Z snrvro04 vco"
如果能查到结果,说明字段内容没问题,再回头调正则;如果查不到,那得先去排查Logstash的syslog接收配置,确保message字段正确解析了。
4. 用ES Dev Tools直接发请求排查
如果Kibana界面还是搞不定,直接用Dev Tools写原生ES查询,能更精准定位问题:
GET /你的索引名/_search { "query": { "regexp": { "message": { "value": "<14>1 2018-05-02T13:53:48\\.079000Z snrvro04 vco.*", "flags": "ALL" } } } }
这里的\\.是因为JSON里要转义反斜杠,实际传给ES的是\.,别写错了。
5. 长远方案:给message加text子字段
如果经常要对日志内容做模糊或正则查询,其实更推荐在索引模板里给message同时设置text和keyword类型:
"message": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }
这样message是text类型(适合全文搜索、正则),message.keyword是keyword类型(适合精确匹配、聚合),后续查询可以按需选字段,不用再纠结正则的问题。
内容的提问来源于stack exchange,提问作者Sam Perrin
相关产品推荐
相关产品推荐

