我有一个片段,它使用apachelucene从hibernate搜索中获取搜索结果。当我输入一个搜索参数例如“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();
从上面的代码片段中,我必须注解掉由于错误行而实现的排序算法
1条答案
按热度按时间xmakbtuz1#
默认情况下,hibernate搜索按相关性(score)排序,因此不需要添加自定义排序。
如果某些结果在结果列表中不够高,就意味着他们的分数不够高。为了控制它们的得分,最简单的解决方案可能是添加更多的查询。通常,特定文档匹配的查询越多,其得分就越高。
在这种情况下,您可以尝试以下操作:
然后,当文档精确或近似地包含“college”时,它们将匹配,但如果文档精确地包含“college”,则它们将匹配两个查询,得分更高,并且在结果列表中显示得更高。
如果您的问题确实是关于首先包含术语“college”的文档,也就是说,对在开始处包含搜索术语的文档给予更高的分数,那么您也可以这样做,但这是一个更不寻常的用例。再加一个
.should()
带a的子句SpanQuery
. 你可以在这个答案中找到更多的信息。