尝试基于最接近匹配的java对hibernate搜索结果进行排序

t3irkdon  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(365)

我有一个片段,它使用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();

从上面的代码片段中,我必须注解掉由于错误行而实现的排序算法

xmakbtuz

xmakbtuz1#

默认情况下,hibernate搜索按相关性(score)排序,因此不需要添加自定义排序。
如果某些结果在结果列表中不够高,就意味着他们的分数不够高。为了控制它们的得分,最简单的解决方案可能是添加更多的查询。通常,特定文档匹配的查询越多,其得分就越高。
在这种情况下,您可以尝试以下操作:

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”的文档,也就是说,对在开始处包含搜索术语的文档给予更高的分数,那么您也可以这样做,但这是一个更不寻常的用例。再加一个 .should() 带a的子句 SpanQuery . 你可以在这个答案中找到更多的信息。

相关问题