如何用query_string的‘basket’匹配含‘basketball’和‘basket’的结果?
解决方案
要通过最小修改实现用basket查询出name字段包含basketball和basket的结果,只需调整query_string中的query值为带通配符的形式,具体如下:
修改后的查询语句
{ "query" : { "filtered": { "query": { "query_string": { "query": "basket*", "default_operator": "AND", "analyze_wildcard": true } } } }, "size" : 50, "from" : 0, "sort" : {} }
原理说明
- 你的查询中已经开启了
analyze_wildcard: true,这意味着Elasticsearch会对包含通配符的查询字符串进行分析,同时保留通配符的匹配逻辑。 - 使用
basket*作为查询词,会匹配所有以basket开头的词汇:- 直接匹配原始值为
basket的文档; - 匹配分词后包含
basket前缀的词汇(比如basketball经过word_delimiter过滤器拆分后会得到basket和ball,也会被basket*匹配到)。
- 直接匹配原始值为
- 仅修改
query字段的值,其余配置保持不变,满足你“尽可能少做修改”的要求。
补充说明
如果你的filename分词器对basketball的处理是直接保留为完整词而非拆分,basket*依然能匹配到它,因为通配符会匹配该词的前缀部分。
内容的提问来源于stack exchange,提问作者Ramix
相关产品推荐
相关产品推荐

