solr排序过滤score过低的结果

2 篇文章 0 订阅

在solr搜索中,我们免不了要将搜索的结果按照一定的规则排序。然而,在排序的过程中我们经常会用到Analyzer,这会使得排序的结果中出现相关度并不高的结果,特别是可能会出现排名靠前然而相关度并不高,甚至风马牛不相及的结果,实在是蛋疼无比,大大降低用户体验。那么有什么办法可以在排序时过滤掉这些结果呢?


我们知道,在排序的时候,我们可以在sort参数中利用score这个属性来根据每条记录的匹配得分来进行排序。例如,browseNum desc,score desc表示根据浏览数量降序排列,若浏览数量相同,则根据匹配得分排列。同样的,如果我们需要显示某条记录对于某个搜索条件的score,可在fl字段中指定score。例如指定*,score,表明显示document的所有字段并返回这条记录的score。如图所示。


这样看来,如果我在solr的q字段也加上对score的限制,就可以实现过滤了吧?答案是否定的,因为如果你这样做的话,solr会报错,报错信息就是没有score这个字段(undefined field: \"score\")。


那么,我们怎样才能实现过滤呢?其实我们可以利用frange这个运算来实现。frange规定了一个字段的范围,用法如图所示。


同样地,我们也可以将frange运算用在函数上。query($var)这个函数可以返回对特定查询的匹配分值。其用法如下:

http://localhost:8993/solr/test/select?fl=*,score&q={!frange l=3.2}query($var)&indent=on&var=name:妖精的尾巴&wt=json

标蓝的地方表示所需要的搜索条件。由于在调用query函数的时候指定的参数名为var,所以在传递参数的时候也应该把具体的搜索条件放在var参数上。

实际上,上面的做法已经足以实现过滤score较低的搜索结果了。但是,还是有一个问题,就是如果这样搜索的话,就无法再按照score进行排序,也无法正确地显示每条记录的score。其实这个问题也不难解决,我们可以利用filterQuery,也就是fq字段进行过滤。


如图所示,在fq字段指定针对score的过滤,这里将字段名称设为q,可以正好与solr默认的搜索条件字段相对应。同样地,我们根据playNum字段进行降序排序,在playNum相同的情况下根据score降序排列,并且在返回结果中显示每个document的score。最终效果如图所示。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值