【问题标题】:Elastic search query containing '!' in regexp query doesnt match against any results包含“!”的弹性搜索查询在正则表达式查询中不匹配任何结果
【发布时间】:2026-01-24 16:25:02
【问题描述】:

查询下方的弹性搜索不返回任何结果:

1.) {"query":{"regexp":{"field_name":".*f04((?!z).)*"}}

为什么像上面这样的查询没有返回任何结果?

我期待这样的结果: ['f00bar', 'f04bar', 'f04barbuh', 'f04ba']

而下面一个返回:

2.) {"query":{"regexp":{"field_name":".*f04((?!z).)*.*"}}

由此返回的结果:['f04bar', 'f04barbuh', 'f04ba', 'f04baz']

我知道第二个查询返回结果是因为 .* 最后,正则表达式中的'!' 有什么问题,应该是别的什么吗?我们如何使用!作为正则表达式的一部分来指定ba后面不应该跟z

【问题讨论】:

    标签: regex elasticsearch elasticsearch-dsl elasticsearch-dsl-py


    【解决方案1】:

    regexp 查询针对包含基础数据的分析版本的索引运行。默认情况下使用standard 分析器,它将文本拆分为单词(只是字母数字),删除其他所有内容(这里将删除!),然后将所有内容小写。

    要确切了解发生了什么,您可以使用_analyze API 来修改该进程,要么将该字段映射为keyword,要么指定一个不同的analyzer

    【讨论】:

    • 我的字段只映射为关键字,如下所示: { "field_name1": { "type": "keyword" }, "field_name2": { "type": "keyword" }, "query" : { "properties": { "regexp": { "properties": { "field_name1": { "type": "keyword" }, "field_name2": { "type": "keyword" } } } } } }