Elasticsearch的html_strip字符过滤器在query_string查询中不符合预期
核心原因
两种查询的行为差异源于查询词的分析逻辑和目标字段匹配范围的不同:
match查询的行为
当使用match明确指定description字段时,Elasticsearch会严格调用该字段配置的my_analyzer(包含html_strip字符过滤器)处理查询词<html>。html_strip会完全移除HTML标签内容,最终查询词被处理为空,因此没有匹配结果,符合预期。query_string查询的默认行为
未指定default_field时,query_string默认会搜索所有可搜索字段(等同于通配符*),且不会强制使用某个特定字段的分析器。此时查询词<html>会被索引的默认分析器(standard)处理:该分析器不会移除HTML标签,只会剥离<和>符号,提取出html作为查询词。
尽管description字段的索引中没有html这个词,但query_string会尝试匹配所有字段,若存在其他字段(如部分元字段)的分析逻辑未过滤该词,或查询的容错处理导致意外匹配,就会返回目标文档。
解决方案
要让query_string查询和match查询表现一致,只需明确指定default_field为description,强制使用该字段的my_analyzer处理查询词:
GET /test_index/_search { "query": { "query_string": { "query": "<html>", "default_field": "description" } } }
执行该查询后,<html>会被html_strip过滤为空,不会返回任何文档,符合预期。
额外优化(可选)
如果需要全局统一query_string的默认查询字段,可以修改索引设置:
PUT test_index/_settings { "index.query.default_field": "description" }
配置后,后续的query_string查询无需手动指定字段,会默认使用description字段的分析器处理查询词。
内容的提问来源于stack exchange,提问作者Manikandan M

