尝试根据最接近的匹配项对休眠搜索结果进行排序 java
attempting to sort hibernate search results based on closest match java
我有一个片段可以使用 apache lucene 从休眠搜索中获取搜索结果。当我输入一个搜索参数,例如“college”时,以 college 开头的单词的结果出现在搜索结果的下方。考虑到结果,我决定对结果集进行排序,下面是我的方法,但它没有按预期工作
org.apache.lucene.search.Query luceneQuery = qb.keyword().fuzzy().withThreshold(.8f)
.withPrefixLength(1).onFields("fieldName").boostedTo(3)
.matching(searchTerm).createQuery();
// org.hibernate.search.FullTextQuery query = s.createFullTextQuery( luceneQuery, MyEntity.class );
// org.apache.lucene.search.Sort sort = new Sort(
// SortField.FIELD_SCORE,
// new SortField("id", SortField.STRING, true));
// luceneQuery.setSort(sort);
// List results = query.list();
从上面的片段中,由于错误行,我不得不注释掉我正在实施的排序算法
Hibernate Search 默认按相关性(得分)排序,因此您不需要添加自定义排序。
如果某些结果在结果列表中不够高,则表示它们的分数不够高。要控制他们的分数,最简单的解决方案可能是添加更多查询。通常,特定文档匹配的查询越多,它的分数就越高。
在这种情况下,您可以这样尝试:
org.apache.lucene.search.Query fuzzyQuery = qb.keyword().fuzzy().withThreshold(.8f)
.withPrefixLength(1).onFields("fieldName").boostedTo(3)
.matching(searchTerm).createQuery();
org.apache.lucene.search.Query exactQuery = qb.keyword().onFields("fieldName").boostedTo(10)
.matching(searchTerm).createQuery();
org.apache.lucene.search.Query luceneQuery = qb.bool()
.should(fuzzyQuery)
.should(exactQuery)
.createQuery();
然后,当文档完全或大致包含“college”时,它们将匹配,但如果它们完全包含“college”,它们将匹配两个查询,具有更高的分数,并在结果列表中出现更高的位置。
如果您的问题确实是关于包含术语“大学”first 的文档,即给开头附近包含搜索术语的文档更高的分数,那么您可以可能也会这样做,但这是一个更不寻常的用例。只需添加另一个带有 SpanQuery
的 .should()
子句。您可以找到更多信息 in this answer.
我有一个片段可以使用 apache lucene 从休眠搜索中获取搜索结果。当我输入一个搜索参数,例如“college”时,以 college 开头的单词的结果出现在搜索结果的下方。考虑到结果,我决定对结果集进行排序,下面是我的方法,但它没有按预期工作
org.apache.lucene.search.Query luceneQuery = qb.keyword().fuzzy().withThreshold(.8f)
.withPrefixLength(1).onFields("fieldName").boostedTo(3)
.matching(searchTerm).createQuery();
// org.hibernate.search.FullTextQuery query = s.createFullTextQuery( luceneQuery, MyEntity.class );
// org.apache.lucene.search.Sort sort = new Sort(
// SortField.FIELD_SCORE,
// new SortField("id", SortField.STRING, true));
// luceneQuery.setSort(sort);
// List results = query.list();
从上面的片段中,由于错误行,我不得不注释掉我正在实施的排序算法
Hibernate Search 默认按相关性(得分)排序,因此您不需要添加自定义排序。
如果某些结果在结果列表中不够高,则表示它们的分数不够高。要控制他们的分数,最简单的解决方案可能是添加更多查询。通常,特定文档匹配的查询越多,它的分数就越高。
在这种情况下,您可以这样尝试:
org.apache.lucene.search.Query fuzzyQuery = qb.keyword().fuzzy().withThreshold(.8f)
.withPrefixLength(1).onFields("fieldName").boostedTo(3)
.matching(searchTerm).createQuery();
org.apache.lucene.search.Query exactQuery = qb.keyword().onFields("fieldName").boostedTo(10)
.matching(searchTerm).createQuery();
org.apache.lucene.search.Query luceneQuery = qb.bool()
.should(fuzzyQuery)
.should(exactQuery)
.createQuery();
然后,当文档完全或大致包含“college”时,它们将匹配,但如果它们完全包含“college”,它们将匹配两个查询,具有更高的分数,并在结果列表中出现更高的位置。
如果您的问题确实是关于包含术语“大学”first 的文档,即给开头附近包含搜索术语的文档更高的分数,那么您可以可能也会这样做,但这是一个更不寻常的用例。只需添加另一个带有 SpanQuery
的 .should()
子句。您可以找到更多信息 in this answer.