我一直在寻找类似的问题,但似乎没有任何帮助。
我想对查询结果进行排序,但要保持提升顺序。
例如,我创建了一个orQuery
, 里面有 3 个查询Occur.SHOULD
,并提升了 2.0、1.0 和 0.2。然后,当我进行排序时,我希望 boost 2.0 的结果保持在顶部但排序,然后 boost 1.0 的结果也排序,最后最后一个查询 (0.2) 的结果也排序。
您可以将结果想象为三组排序结果。
有什么可以用的吗???
我看到了几种解决方法:
1 - 使提升的差异巨大。
如果您在查询中应用的提升因子足够大,它们应该覆盖所有其他影响分数的因子。因此,除了 0.2、1.0 和 2.0,您可以尝试 0.000001、1.0 和 1000000 来尝试一些东西。尝试一下,直到你得到可用的东西。然后,按照相关性(Sort.RELEVANCE
)排序,这是默认设置,然后您不仅可以得到您想要的排序,还可以在这些子组中维护所有其他有用的评分方面。
2 - 实际上通过查询提升应用排序
这是您需要严格按照提升因子排序的选项,其次是单个查询中的一些其他排序参数。
Lucene 的排序不会让您直接看到应用于术语的提升因子(出于充分的理由,想要做这件事有点奇怪。提升是为了影响分数,而不是成为分数)。它给你的最接近的是按相关性排序,当然,这会影响很多其他事情。
如果您需要获得原始提升因子,则需要覆盖Similarity。
需要考虑三个提升:
Similarity.computeWeight
您似乎有兴趣获得的唯一提升是查询级别提升,这应该是最容易处理的。您可以修改TFIDFSimilarity,或者从头开始创建 [Similarity] 的子类。无论哪种方式,您都希望删除大部分逻辑,只返回查询提升。
我认为你不能开箱即用地做到这一点。您可以实现自己的Collector
,但单独运行三个搜索然后合并结果会容易得多。