基于Hibernate搜索/ Lucene的排序问题



我在排序中有一个问题,下面指定。

之前,代码写成

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

这是一个由a stackoverflow粘贴的自定义排序答案的例子,在Lucene中基于数字字段排序搜索结果。

虽然他不认为这是正确的排序方式,但这也是我们公司多年来一直使用的代码。

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

我需要删除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有时返回正确的值,有时不返回?

SortField.FIELD_SCORE的用法是什么?如何计算场次得分?

当您搜索包含单词的文档时,每个文档被分配一个"分数":float值,通常为正。这个值越高,匹配越好。如何精确地计算它有点复杂,当你有多个嵌套查询(例如布尔查询等)时,它会变得更糟,因为分数会与其他公式结合在一起。我只想说:分数是一个数字,每个文档都有一个值,越高越好。

SortField.FIELD_SCORE将简单地按降序排序文档。

为什么要呈现SortField。FIELD_SCORE有时返回正确的值,有时不?

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

但是,在您的排序中有一点很突出,您是根据实际字段按分数排序的。这种做法不太可能奏效。分数通常是唯一的,所以除非你的文档非常相似(例如,由于某种原因,所有文本字段都是空的),排名靠前的文档将有这样的分数:[5.1, 3.4, 2.6, 2.4, 2.2]。它们的顺序已经"完成"了:您可以添加任意多的后续排序,顺序不会改变,因为它是由分数排序完全定义的。

想想字母顺序:如果我要排序["area", "baby"], "baby"可能是&;a&;,但没关系,因为第一个字母是&;&;它总是在"a"后面;的"area".

所以,如果你对按分数排序不感兴趣(如果你不知道分数是什么,很可能你真的不感兴趣),那就坚持按字段排序:

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,新的,也在维护)。

相关内容

  • 没有找到相关文章

最新更新