如何解决尝试根据最接近的匹配 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”,则它们将匹配两个查询,具有更高的分数,并在结果列表中出现更高的位置。
如果您的问题确实是关于包含“college”一词的文档first,即对包含搜索词的文档在开头附近给予更高的分数,那么您也可以这样做,但这是一个更不寻常的用例。只需添加另一个带有 .should()
的 SpanQuery
子句。您可以找到更多信息in this answer。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。