Solr不同类型字段boost查询得分计算规则不一致如何解决
问题原因
出现该得分差异的核心原因是两个字段的类型对应的相似度计算规则不同:
category_id为pint数值类型,默认关闭tf、idf、长度归一化等全文本评分逻辑,匹配成功就直接叠加完整boost值event_attendance_mode为text文本类型,默认启用BM25评分逻辑(你场景中SchemaSimilarity默认使用BM25算法),最终得分为boost值 × idf值 × tf值,所以会低于你设置的固定boost
实现方案
方案1:两个字段都不进行tf-idf计算,匹配成功直接叠加固定boost
如果不需要全文本相关的评分逻辑,推荐优先使用该方案,实现最简单:
方案1.1 调整event_attendance_mode字段类型
该字段属于枚举值类字段(仅存储online/offline等固定值),无需分词,直接将类型改为string即可:
<field name="event_attendance_mode" type="string" indexed="true" stored="true" multiValued="true" default="offline" />
修改后重启Solr、重新索引数据即可,匹配后会直接叠加你设置的100倍boost,不会再做额外得分计算。
方案1.2 不想改字段类型的情况下,单独配置相似度
如果必须保留text类型的分词能力,可以给该字段的字段类型配置ConstantScoreSimilarity,关闭tf/idf计算:
<fieldType name="text_constant_score" class="solr.TextField"> <!-- 保留你原有分词配置 --> <analyzer> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> <similarity class="solr.ConstantScoreSimilarity"/> </fieldType>
再将event_attendance_mode的type属性改为text_constant_score,重新索引即可生效。
方案2:两个字段都进行tf-idf/BM25计算
修改category_id的字段配置,让数值类型也启用相似度计算:
<fieldType name="pint_with_similarity" class="solr.IntPointField" multiValued="true"> <similarity class="solr.SchemaSimilarity"/> </fieldType>
将category_id的type属性改为pint_with_similarity,重新索引数据后,category_id匹配的得分也会经过idf、tf的计算,和event_attendance_mode的评分规则完全一致。
临时查询级别的统一方案
如果不想修改schema和重建索引,可以直接替换查询参数,用boost函数替代bq参数,强制统一评分规则:
原bq参数全部删除,新增如下参数即可:
boost=if(termfreq(category_id,26),10,1) * if(termfreq(event_attendance_mode,'online'),100,1)
该配置下不管字段本身的相似度规则是什么,只要匹配到对应值就叠加固定权重,不会走额外的tf/idf计算。
内容的提问来源于stack exchange,提问作者Anshul Verma
相关产品推荐
相关产品推荐

