Kibana 7.9.1中匹配特定URL路径的正则查询问题
解决Kibana 7.9.1 Query DSL匹配特定URL路径的问题
首先说清楚你之前写法失效的核心原因:你的URL字段应该是text类型,用了默认的标准分词器——这个分词器会把斜杠/当成分隔符,把整个路径拆成rest、requirements、数字这类单独的词存在索引里。所以你直接搜带斜杠的完整字符串自然匹配不到,而.*requirements.*能生效,是因为它找的是包含requirements这个词的文档,不管上下文结构。
要精准匹配/rest/requirements/<数字ID>/且末尾无其他内容的路径,按下面的方法来:
方法一:用字段的keyword子字段查询(推荐)
绝大多数场景下,text类型的字段会自动生成同名的keyword子字段,这个子字段存储的是完整的未分词字符串,非常适合做精准匹配或正则匹配。
用以下Query DSL:
{ "query": { "regexp": { "url.keyword": "^/rest/requirements/[0-9]+/$" } } }
正则的细节说明:
^和$强制匹配字符串的开头和结尾,确保路径末尾没有额外内容[0-9]+匹配至少一个数字,避免匹配到/rest/requirements//这种空ID的情况(如果业务允许空ID,改回[0-9]*即可)
方法二:如果没有keyword子字段
可以临时用match_phrase匹配完整结构,但精准度不如正则:
{ "query": { "match_phrase": { "url": "/rest/requirements/" } } }
不过这个只能匹配包含/rest/requirements/的完整短语,没法限制末尾的数字和结尾斜杠,还是优先推荐方法一。如果你的字段确实没有keyword子字段,建议修改字段映射添加一个,方便后续各类精准查询。
补充:你之前的写法为啥都失败?
- 直接用
/rest/requirements/[0-9]*/:text字段分词后不存在完整的这个字符串,所以匹配不到 - 用
\rest\requirements.*:在Query DSL的字符串里,反斜杠需要转义成\\,而且就算转义了,text字段里也没有带斜杠的词,依然无效 - 多斜杠或用点代替斜杠的写法:同样因为分词拆分了路径结构,无法匹配到完整的目标路径
内容的提问来源于stack exchange,提问作者Caue Napier
相关产品推荐
相关产品推荐

