基于 Hibernate Search / Lucene 的排序问题

Hibernate Search / Lucene based Sorting Issue

我在排序时遇到问题,具体如下。

之前代码写成

Sort sort = new Sort(new SortField[] {
   SortField.FIELD_SCORE,
   new SortField("field_1", SortField.STRING),
   new SortField("field_2", SortField.STRING),
   new SortField("field_2", SortField.LONG)
});

这是一个 Whosebug 答案粘贴在这里用于自定义排序的示例, Sorting search result in Lucene based on a numeric field.

虽然他并不认为这是进行排序的正确方法,但这也是我公司多年来使用的代码。

但是当我创建一个新函数时,需要对很多字段进行排序,并且通过执行单元测试,我发现它实际上并没有按预期工作。

我需要删除 SortField.FIELD_SCORE 才能使其正常运行。我认为如果我理解正确的话,此处描述的示例会建议这样做,https://docs.jboss.org/hibernate/search/4.1/reference/en-US/html_single/#d0e5317.

即主要代码将转换为

Sort sort = new Sort(new SortField[] {
   new SortField("field_1", SortField.STRING),
   new SortField("field_2", SortField.STRING),
   new SortField("field_2", SortField.LONG)
});

所以我的问题是

  1. SortField.FIELD_SCORE有什么用?场上得分如何计算?
  2. 为什么显示 SortField.FIELD_SCORE 有时 return 正确值,有时不正确?

what is the usage of SortField.FIELD_SCORE? How does the field score be calculated?

当您搜索包含某个词的文档时,每个文档都会分配一个“分数”:float 值,通常为正值。该值越高,匹配越好。这是如何计算的 is a bit complex,当您有多个嵌套查询(例如布尔查询等)时,情况会变得更糟,因为分数会与其他公式结合使用。可以这么说:分数是一个数字,每个文档都有一个值,越高越好。

SortField.FIELD_SCORE 将简单地按分数降序对文档进行排序。

Why presenting SortField.FIELD_SCORE sometimes return correct value, sometimes don't?

很难说。这取决于很多因素,例如您的分析器、您运行 的确切查询,甚至是文档中搜索词的频率。正如我所说,用于计算分数的公式很复杂。

不过,在您的排序中,有一点很突出,那就是您按得分 按实际字段排序。这不太可能奏效。分数通常是唯一的,因此除非您的文档非常相似(例如,由于某种原因所有文本字段都是空的),否则排名靠前的文档的分数将如下所示:[5.1, 3.4, 2.6, 2.4, 2.2]。他们的顺序已经“完整”:你可以添加任意多的后续排序,顺序不会改变,因为它完全由分数排序定义。

想想字母顺序:如果我必须排序["area", "baby"],“baby”的第二个字母可能是“a”,但没关系,因为第一个字母是“b”和它总是在“区域”的“a”之后。

因此,如果您对按分数排序不感兴趣(并且,如果您不知道分数是什么,很可能您确实不感兴趣),只需坚持按字段排序即可:

Sort sort = new Sort(new SortField[] {
   new SortField("field_1", SortField.STRING),
   new SortField("field_2", SortField.STRING),
   new SortField("field_2", SortField.LONG)
});

如果您对按分数排序感兴趣,那么只需按分数排序即可:

Sort sort = new Sort(new SortField[] {
   SortField.FIELD_SCORE
});

// Or equivalently
Sort sort = Sort.RELEVANCE; // "Relevance" means "sort by score"

请注意,Hibernate Search 4.1(您的文档的版本 link)非常旧;您应该考虑至少升级到 5.11 (similar API, also old but still maintained), and preferably to 6.0(不同,但更现代 API,新的并且还在维护)。