我正在使用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个项目,那将是一个问题,查询将太长导致通信问题。
我能做到这一点吗?如果没有,我可以使用乘法或指数运算来获得更少字符的大增长因子吗?
由于
答案 0 :(得分:0)
一个可行的选择是写一个custom Solr function,它输入字段的名称并按位置增加内容。例如:
bq=myCustomBoostFunction(fieldName, boostFactor)
其中boostFactor可以是可选的,或者您可以在解决方案中省略它。任何提升都将是您函数中java代码的一部分。 这种解决方案有利有弊:
<强>赞成强>
相同的功能可以在没有任何额外实现的情况下重复用于其他字段;
提升系数可让您调整解决方案;
任何计算都将在Java代码中完成,而不会影响查询长度。
<强>缺点强>
- 如果您阅读字段的内容而不是使用有效负载,则您的函数实现可能会很慢。
答案 1 :(得分:0)
由于使用默认相似度(TF,IDF计算),提升因子失败。您可以使用NoTfIDF相似度,一个单词匹配的得分仅为1。然后这应该工作。
此外,您可以使用/ get处理程序,而不是常规查询,该处理程序可以获取ID列表并以相同顺序返回请求的fls。但是您必须自己处理分页。也就是说,将可能出现的所有ID发送到请求的页面。