Hibernate搜索在顶部显示匹配的关键字字段,然后对其余字段进行排序

qxgroojn  于 2022-11-07  发布在  Lucene
关注(0)|答案(1)|浏览(194)

使用本地lucene的Hibernate搜索6.0.1
我有一个搜索功能,用户可以在两个字段中搜索一个词,其中一个是全文搜索,另一个是精确的关键字匹配。

Class A

@FullTextField(termVector = TermVector.YES, analyzer = "...", searchAnalyzer = "...")
private String text;

@KeywordField
private String keyword;

@IndexedEmbedded(includePaths = {"number"})
@OneToOne(mappedBy = "a", fetch = FetchType.LAZY)
private Stats stats;

我的搜索功能如下;

searchSession.search(A.class)
.where(f -> f.bool()
        .should(f.match().field("text").matching(query))
        .should(f.match().field("keyword").matching(query))
)
.sort(f -> f.field("stats.number").desc().missing().last())
.fetch(offset, limit);

我想搜索这两个字段,结果按数字排序。但是,我还想在搜索结果顶部显示与关键字完全匹配的结果。(关键字是唯一的)
为了实现这一点,我应该怎么做?我是否需要将搜索功能分成两个不同的查询,然后将它们合并?或者有没有更好的做法?

llycmphe

llycmphe1#

使用score排序和按 predicate 提升将给定 predicate 的匹配项放在结果列表中的较高位置。然后使用字段排序对得分相同的结果进行排序。
这样就可以了:

searchSession.search(A.class)
.where(f -> f.bool()
        .should(f.match().field("text").matching(query)
            .constantScore().boost(1.0f))
        .should(f.match().field("keyword").matching(query)
            .constantScore().boost(2.0f))
)
.sort(f -> f.score().then().field("stats.number").desc().missing().last())
.fetch(offset, limit);

另请参阅:

  • https://docs.jboss.org/hibernate/stable/search/reference/en-US/html_single/#search-dsl-sort-score
  • https://docs.jboss.org/hibernate/stable/search/reference/en-US/html_single/#search-dsl-sort-composite
  • https://docs.jboss.org/hibernate/stable/search/reference/en-US/html_single/#search-dsl-predicate-common-boost
  • https://docs.jboss.org/hibernate/stable/search/reference/en-US/html_single/#search-dsl-predicate-common-constantScore

相关问题