Elasticsearch 如何在所有场景下均返回有效搜索结果
实现方案
你当前使用的regexp正则查询存在明显缺陷:属于词项级查询不会做分词匹配,匹配失败就直接返回空结果,不支持空输入场景,性能也不适合作为全文搜索的主查询。可以按照以下思路改造:
1. 核心逻辑改造
用bool组合查询实现兜底逻辑,把用户关键词匹配规则作为可选条件,配置minimum_should_match=0,就算所有匹配规则都不命中,也能返回兜底结果:
- 有用户输入时,优先返回匹配到关键词的内容,无匹配时按业务规则返回默认结果
- 空输入时,直接返回按业务规则排序的全量兜底结果
有输入场景查询示例
{ "query": { "bool": { "should": [ // 主匹配:全文匹配title字段,权重更高 { "match": { "title": { "query": "用户输入的关键词", "boost": 10 } } }, // 可选容错:模糊匹配,兼容拼写错误场景 { "fuzzy": { "title": { "value": "用户输入的关键词", "fuzziness": "AUTO", "boost": 2 } } } ], "minimum_should_match": 0, // 核心配置:所有should条件不命中也返回结果 "adjust_pure_negative": true } }, "sort": [ {"_score": {"order": "desc"}}, // 优先按匹配度排序 {"hot_score": {"order": "desc"}}, // 无匹配时按业务热度排序,可自定义为更新时间、销量等 {"create_time": {"order": "desc"}} ] }
空输入场景查询示例
{ "query": { "match_all": {} }, "sort": [ {"hot_score": {"order": "desc"}}, {"create_time": {"order": "desc"}} ], "size": 20 // 自定义返回结果数量 }
2. 优化建议
- 不要用正则查询做全文检索场景的主查询,
match/match_phrase类查询自带分词匹配,性能和召回效果更好 - 兜底结果的排序规则可以根据业务自定义,比如给带有用户偏好标签的内容加权重、优先返回近期热门内容等
- 如果需要进一步优化无匹配时的召回效果,可以叠加同义词查询、拼音纠错查询等规则
内容的提问来源于stack exchange,提问作者wdafoe666
相关产品推荐
相关产品推荐

