2

我一直在寻找类似的问题,但似乎没有任何帮助。

我想对查询结果进行排序,但要保持提升顺序。

例如,我创建了一个orQuery, 里面有 3 个查询Occur.SHOULD,并提升了 2.0、1.0 和 0.2。然后,当我进行排序时,我希望 boost 2.0 的结果保持在顶部但排序,然后 boost 1.0 的结果也排序,最后最后一个查询 (0.2) 的结果也排序。

您可以将结果想象为三组排序结果。

有什么可以用的吗???

4

2 回答 2

1

我看到了几种解决方法:

1 - 使提升的差异巨大。

如果您在查询中应用的提升因子足够大,它们应该覆盖所有其他影响分数的因子。因此,除了 0.2、1.0 和 2.0,您可以尝试 0.000001、1.0 和 1000000 来尝试一些东西。尝试一下,直到你得到可用的东西。然后,按照相关性(Sort.RELEVANCE)排序,这是默认设置,然后您不仅可以得到您想要的排序,还可以在这些子组中维护所有其他有用的评分方面。

2 - 实际上通过查询提升应用排序

这是您需要严格按照提升因子排序的选项,其次是单个查询中的一些其他排序参数。

Lucene 的排序不会让您直接看到应用于术语的提升因子(出于充分的理由,想要做这件事有点奇怪。提升是为了影响分数,而不是成为分数)。它给你的最接近的是按相关性排序,当然,这会影响很多其他事情。

如果您需要获得原始提升因子,则需要覆盖Similarity

需要考虑三个提升:

  • 查询提升:作为查询的一部分应用,这将被传递到Similarity.computeWeight
  • 字段和文档提升:在索引时应用,组合并存储在索引中,同时结合“长度规范”因子。

您似乎有兴趣获得的唯一提升是查询级别提升,这应该是最容易处理的。您可以修改TFIDFSimilarity,或者从头开始创建 [Similarity] 的子类。无论哪种方式,您都希望删除大部分逻辑,只返回查询提升。

于 2013-03-25T16:17:22.463 回答
1

认为你不能开箱即用地做到这一点。您可以实现自己的Collector,但单独运行三个搜索然后合并结果会容易得多。

于 2013-03-25T16:00:40.180 回答