Elasticsearch不使用sort如何将缺考学生文档排在搜索结果末尾
Elasticsearch 7.9.0 缺考学生排序解决方案
要实现保留默认评分排序规则、仅将缺考(student.total_marks = 0)文档排在末尾的需求,同时不直接对total_marks字段添加sort排序,可以通过给非缺考文档增加固定大额权重的方式实现,原理是让所有非缺考文档的总分都高于缺考文档,且非缺考文档之间的相对排序保持默认评分的相对顺序不变。
方案1:Bool查询加固定权重
在原有查询基础上新增should子句,给非缺考文档加1000(可根据实际业务场景调大,只要大于正常查询的最大评分即可)的固定权重,minimum_should_match设为0不影响原有匹配逻辑:
GET your_index_name/_search { "query": { "bool": { "must": [ // 此处替换为你原来的业务查询条件,比如match、term等 {"match_all": {}} ], "should": [ { "constant_score": { "filter": { "range": { "student.total_marks": { "gt": 0 } } }, "boost": 1000 } } ], "minimum_should_match": 0 } } }
方案2:Function Score查询
使用function_score的weight函数给非缺考文档加固定权重,boost_mode设为sum,将权重和原有评分相加:
GET your_index_name/_search { "query": { "function_score": { "query": { // 此处替换为你原来的业务查询条件 {"match_all": {}} }, "functions": [ { "filter": { "range": { "student.total_marks": { "gt": 0 } } }, "weight": 1000 } ], "boost_mode": "sum" } } }
补充说明
之前使用负向boosting未生效的核心原因是负向降权的幅度不可控,若缺考文档的原始匹配评分过高,降权后仍可能超过非缺考文档的评分。而正向加足够大的固定权重的方案可以100%保证非缺考文档的总分高于缺考文档,同时不改变非缺考文档之间的默认排序逻辑,也符合不直接对total_marks字段做sort排序的要求。
内容的提问来源于stack exchange,提问作者Manonandan S K
相关产品推荐
相关产品推荐

