Python操作Elasticsearch:如何实现查询词全匹配且按词序排序返回结果
解决方案
核心实现逻辑
- 原
match查询默认使用or逻辑,所以只要匹配单个查询词就返回结果,首先要修改为and逻辑强制匹配所有查询词 - 新增
match_phrase查询提升完全符合查询词顺序的文档权重,无需额外修改排序规则,ES默认的得分排序就会把完全匹配的结果排在最前 - 其余仅满足全词匹配、不满足顺序要求的文档会遵循ES默认的BM25相关度排序规则排在中后部
调整后的Python查询代码
result = es.search( index="main_database", body={ "query": { "bool": { "must": [ # 强制要求所有查询词都存在 {"match": {"Full_texts": {"query": es_query, "operator": "and"}}} ], "should": [ # 匹配到完全顺序的短语时额外提升得分,实现靠前展示 {"match_phrase": {"Full_texts": es_query}} ] } } }, size=50 )
可选拓展配置
如果允许查询词之间插入少量其他字符仍判定为顺序匹配,可以给match_phrase添加slop参数,数值代表允许的最大词间隔数:
{"match_phrase": {"Full_texts": {"query": es_query, "slop": 1}}}
内容的提问来源于stack exchange,提问作者Bold Ganbaatar
相关产品推荐
相关产品推荐

