场景是为多个字段值提升文档:
我有一个字段“Category
”,其中包含值 - “News
”,“image
”,“video
”,“audio
”。< / p>
现在根据上面提到的字段值,我想对它们进行一些提升(优先级),例如“News
”获得最高优先级,然后是“video
”,而不是“audio
”等等。
与类别相似,只有少数字段需要根据字段值以相同方式提升。
实施例。提升规则可以是,
Category= News^1000
Category= Image^900
Premium_Contents = True^200
Sponsored = True^300
......等等
所以我遇到了一个解决方案Reference。我正在尝试找出计算搜索相关性结果集的最佳方法。
答案 0 :(得分:3)
是的,我认为你的链接是一个合理的想法。这是我们使用的,因为我们想要强制执行是对所有搜索的提升,我们不会经常更改逻辑,例如在您的情况下: -
<requestHandler name="/select" class="solr.SearchHandler">
<lst name="defaults">
<str name="defType">edismax</str>
<str name="boost">product(
map(query($type1query),0,0,1,$type1boost),
map(query($type2query),0,0,1,$type2boost))</str>
<str name="type1query">Category:"News"</str>
<double name="type1boost">1000.0</double>
<str name="type2query">Category:"Image"</str>
<double name="type2boost">900.0</double>
</lst>
</requestHandler>
在这种情况下,查询函数返回特定查询的分数。那就是在类别中寻找新闻,图像等的匹配。
map函数具有以下签名:map(x,min,max,target,value)将函数x的任何值映射到min和max(包括目标)。 min,max,target,value是常量。如果字段的值不在最小值和最大值之间,则输出字段的值(或“值”)。换句话说,如果查询结果是正值(有匹配),它将输出提升(1000,900等)。您需要使用提升值,因为它们可以压倒您拥有的任何其他排名逻辑。如果在视频上有更好的匹配,你可能会在新闻排名上得到糟糕的比赛,比如说。
您可以使用这些提升创建单独的请求处理程序,以便绕过它们进行其他搜索。显然,如果进行任何更改,您必须更改solrconfig并重新启动Solr,这可能是一个问题。
否则请查看bq(提升查询)参数。
bq=Category:News^1000.0+Category:Image^900...
实际上会在封面下生成类似的东西
boost(+*:* (Category:News^1000 + Category:Image^900))
这意味着增强功能在您的搜索代码中完成,非常灵活。我个人更喜欢这种工作方式。