基于流行度与自定义分值动态调整Solr字段boost值的方案咨询
可行实现方案
你的需求可以通过Solr原生函数查询直接实现,无需修改现有索引结构,以下是两种成熟的可选方案:
方案1:直接对原有查询得分做动态Boost(推荐)
通过嵌套if或map函数拼接bf(Boost Function)参数,对匹配到对应model的文档,直接将原有查询score按你给出的自定义分值做乘法/加法调整,最终按调整后的综合分排序。
示例(匹配你给出的2个model映射,乘法Boost逻辑):
bf=if(term(model,44758514),product(score,1.352398),if(term(model,51148767),product(score,1.160451),score))
如果需要做加法叠加而非乘法,把product替换为sum即可。
如果你的映射列表较长,避免多层if嵌套可以用map函数简化写法:
bf=product(score, map(model, 44758514, 44758514, 1.352398, map(model,51148767,51148767,1.160451, 1)))
map函数语法为map(匹配字段, 匹配最小值, 匹配最大值, 命中返回值, 未命中返回值),固定值匹配时最小/最大值填写相同值即可,末尾的1代表未匹配到的model默认不做Boost。
方案2:动态调整popularity字段值再计算综合分
如果你希望基于popularity字段做值提升,再和原有查询得分加权求和,也可以用相同的函数逻辑实现:
bf=sum( product(score, 0.7), product( if(term(model,44758514), product(popularity,1.352398), if(term(model,51148767),product(popularity,1.160451),popularity)), 0.3 ) )
其中0.7和0.3为可自定义权重,用来控制原有查询得分和popularity字段在最终排序中的占比。
特殊场景适配
如果你的自定义model映射列表非常长(超过50个),拼接bf参数会导致请求URL过长,可将映射列表提前写入外部文件,通过Solr的ExternalFileField功能加载为查询可用的动态字段,查询时直接调用该字段值做计算即可,无需每次请求传递大量参数。
注意:需确保
model字段为精确匹配类型(非分词字符串/数字类型),才能保证term函数匹配正确。
内容的提问来源于stack exchange,提问作者mp1990
相关产品推荐
相关产品推荐

