尝试根据最接近的匹配项对休眠搜索结果进行排序 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.