Solr - 以与查询中提供的ID相同的顺序检索文档

时间:2016-07-15 18:36:57

标签: solr solrj solr4

我正在使用Apache Solr 4.7.2。

我需要实现以下行为:用户提供ID列表,Solr返回文档分页,并按用户通知ID的相同顺序排序。

我遇到了boost terms方法。因此,如果用户提供ID" 2875141 2873071 2875198 108142 2918841 2870688 107920 2870637 2870636 2870635 2918792 107721 2875078 2875162 2875202 2918809 2918808",我的Solr查询将是:

studentId:(2875141^16 2873071^15 2875198^14 108142^13 2918841^12 2870688^11 107920^10 2870637^9 2870636^8 2870635^7 2918792^6 107721^5 2875078^4 2875166^3 2875151^2 2918829^2 2918808^1) 

但这种方法并不总是有效。对于此示例,我们可以在此explain query看到,^16的最高得分不是。

如果我使用大的提升值,例如1,10,100,1000,10000等,最后在此cookbook中建议添加一个0,则排序正常。但是,如果用户搜索200个项目,那将是一个问题,查询将太长导致通信问题。

我能做到这一点吗?如果没有,我可以使用乘法或指数运算来获得更少字符的大增长因子吗?

由于

2 个答案:

答案 0 :(得分:0)

一个可行的选择是写一个custom Solr function,它输入字段的名称并按位置增加内容。例如:

bq=myCustomBoostFunction(fieldName, boostFactor)

其中boostFactor可以是可选的,或者您可以在解决方案中省略它。任何提升都将是您函数中java代码的一部分。 这种解决方案有利有弊:

<强>赞成

  
      
  • 相同的功能可以在没有任何额外实现的情况下重复用于其他字段;

  •   
  • 提升系数可让您调整解决方案;

  •   
  • 任何计算都将在Java代码中完成,而不会影响查询长度。

  •   

<强>缺点

  
      
  • 如果您阅读字段的内容而不是使用有效负载,则您的函数实现可能会很慢。
  •   

答案 1 :(得分:0)

由于使用默认相似度(TF,IDF计算),提升因子失败。您可以使用NoTfIDF相似度,一个单词匹配的得分仅为1。然后这应该工作。

此外,您可以使用/ get处理程序,而不是常规查询,该处理程序可以获取ID列表并以相同顺序返回请求的fls。但是您必须自己处理分页。也就是说,将可能出现的所有ID发送到请求的页面。