Hibernate Search/Lucene排序问题:SortField.FIELD_SCORE作用与异常咨询
SortField.FIELD_SCORE的作用与得分规则
- 作用:这是Lucene内置的相关性排序字段,加入排序规则数组后,会按照文档和检索条件的匹配相关性得分排序,默认降序排列。如果它处于排序数组的第一位,会作为最高优先级排序依据,只有多个文档得分完全一致时,才会执行后续的自定义字段排序规则。
- 得分计算规则:Lucene当前默认使用BM25模型计算相关性得分(旧版本使用TF-IDF模型),核心影响因素包括:
- 词频:检索关键词在目标文档对应字段中出现的次数,次数越高得分越高
- 逆文档频率:检索关键词在整个索引库的所有文档中出现的频率,出现范围越小得分越高
- 字段长度:匹配的字段内容越短,得分越高
只要文档和检索条件的匹配情况存在差异,最终的相关性得分就可能不同。
保留SortField.FIELD_SCORE时排序结果不稳定的原因
你遇到的时好时坏的情况,核心是SortField.FIELD_SCORE的优先级高于你自定义的业务字段排序:
- 当测试场景中所有匹配文档的相关性得分完全一致时,排序逻辑会落到你定义的field_1、field_2排序规则上,结果就符合预期
- 当测试场景中存在不同文档的相关性得分不一致时,最高优先级已经按照得分完成了排序,后续的业务字段排序规则不会触发,结果就不符合预期
如果你业务上不需要优先展示相关性更高的文档,完全可以移除SortField.FIELD_SCORE,直接按业务字段排序即可,你的修改是正确的。
内容的提问来源于stack exchange,提问作者CHANist
相关产品推荐
相关产品推荐

