【问题标题】:Hibernate Search / Lucene based Sorting Issue基于 Hibernate Search / Lucene 的排序问题
【发布时间】:2021-11-11 21:52:23
【问题描述】:

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

以前,代码写成

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)
});

这是一个由stackoverflow答案粘贴的示例,用于自定义排序, 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 有时会返回正确的值,有时却不返回?

【问题讨论】:

    标签: java hibernate lucene hibernate-search


    【解决方案1】:

    SortField.FIELD_SCORE 的用途是什么?字段分数如何计算?

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

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

    为什么呈现 SortField.FIELD_SCORE 有时会返回正确的值,有时却不会?

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

    但是,在您的排序中突出的一件事是您按分数排序按实际字段。这不太可能运作良好。分数通常是唯一的,因此除非您的文档非常相似(例如,由于某种原因,所有文本字段都是空的),否则排名靠前的文档将具有这样的分数:[5.1, 3.4, 2.6, 2.4, 2.2]。它们的顺序已经“完成”:您可以添加任意数量的后续排序,顺序不会改变,因为它完全由按分数排序定义。

    想想字母顺序:如果我必须对["area", "baby"]进行排序,“baby”的第二个字母可能是“a”,但这没关系,因为第一个字母是“b”,它总是会在“area”的“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(您的文档链接的版本)非常旧;您应该考虑至少升级到 5.11(类似的 API,也很旧,但仍在维护),最好升级到 6.0(不同,但更现代的 API,新的和维护的)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-07
      • 1970-01-01
      • 2011-12-22
      • 1970-01-01
      • 1970-01-01
      • 2013-01-11
      相关资源
      最近更新 更多