Elasticsearch短语匹配失败时触发分词匹配的查询方案求助
Elasticsearch 纯Fallback查询方案
要实现「仅当短语匹配(查询A)无结果时,才触发分词匹配(查询B)」的纯 fallback 逻辑,不能用简单的bool should(因为会同时返回两类结果并排序),可以用以下两种方案:
方案一:单查询嵌套布尔逻辑
通过嵌套bool查询实现互斥分支,确保两个查询逻辑不会同时触发:
GET /content_card/_search { "size": 1000, "track_total_hits": true, "query": { "bool": { "should": [ // 分支1:执行查询A(短语前缀匹配) { "multi_match": { "query": "The Chosen", "fields": ["title^9", "original_title^9"], "type": "phrase_prefix", "boost": 9 } }, // 分支2:仅当查询A无匹配时,执行查询B(分词匹配) { "bool": { "must": [ { "multi_match": { "query": "The chosen", "fields": [ "title^9", "original_title^9", "content_type^9", "type^7", "content_category^7", "genres^7", "lang_names^7", "keywords^7", "cast_names^7", "crews^7", "country_names^5", "overview^5", "company_names^5", "network_names^5", "additional_company_names^5", "content_status^1", "release_year^1", "ratings^1", "seasons_names^1", "episodes_names^0", "_charcters^1" ], "type": "best_fields" } } ], "must_not": [ // 排除查询A有匹配的文档 { "multi_match": { "query": "The Chosen", "fields": ["title^9", "original_title^9"], "type": "phrase_prefix" } } ] } } ], "minimum_should_match": 1 } } }
逻辑说明:
- 当查询A有匹配结果时,第一个
should分支命中,第二个分支因must_not条件不满足而被过滤,最终只返回查询A的结果 - 当查询A无匹配时,第一个分支无命中,第二个分支的
must_not条件成立,触发查询B的结果返回
方案二:业务层两次查询(更直观)
如果业务逻辑允许,也可以在代码中分两步执行:
- 先执行查询A的单独请求,检查返回的
hits.total.value是否为0 - 若结果为0,再执行查询B的请求;若不为0,直接返回查询A的结果
这种方式逻辑更清晰,避免了复杂的嵌套查询,适合对查询性能要求不高的场景。
内容的提问来源于stack exchange,提问作者Silent Killer
相关产品推荐
相关产品推荐

