Elasticsearch带空格通配符查询无结果问题求助
解决Elasticsearch无法匹配短语子串的问题
你的问题核心出在字段分词上:默认的text类型字段会把文本拆分成独立的词项(比如"Profile Test exactly"会被拆成profile、test、exactly三个独立term),而wildcard/正则查询是针对单个词项匹配的,不是整个字段的完整内容,所以你用*test exactly*这种模式根本找不到对应的词项,自然查不到结果。
给你两个可行的解决方案:
方案一:用match_phrase查询(推荐)
这是Elasticsearch中专门用来匹配短语的查询方式,会严格按照词的顺序和相邻关系匹配分词后的内容,完全符合你要找包含"test exactly"子串的需求:
{ "query": { "match_phrase": { "companyName": "test exactly" } } }
如果允许词之间有少量间隔,可以用slop参数调整,比如允许中间隔1个词:
{ "query": { "match_phrase": { "companyName": { "query": "test exactly", "slop": 1 } } } }
方案二:使用字段的keyword子字段进行wildcard/正则查询
如果你的companyName字段是text类型,通常会默认带有一个companyName.keyword的keyword子字段(如果没有,需要修改mapping添加),这个子字段会保存完整的未分词字符串,直接用它做wildcard查询就能匹配整个字符串中的子串:
{ "query": { "wildcard": { "companyName.keyword": "*test exactly*" } } }
正则查询同理,替换成regexp即可:
{ "query": { "regexp": { "companyName.keyword": ".*test exactly.*" } } }
注意:keyword字段的wildcard/正则查询性能不如match_phrase,数据量大时尽量优先用方案一。
内容的提问来源于stack exchange,提问作者Ihor Kuzmin
相关产品推荐
相关产品推荐

