Hibernate 搜索在顶部显示与关键字字段的匹配项,然后对其余部分进行排序
Hibernate search show match with keyword field on top then sort the rest
带有本地 lucene 的 Hibernate Search 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);
我想搜索这两个字段,结果按 number 排序。但是,我还想在搜索结果顶部显示与关键字的完全匹配。 (关键字是唯一的)
为了达到这个目的,我应该怎么做?
我是否需要将搜索功能分成两个不同的查询然后合并它们?或者有更好的做法吗?
使用 score
排序和每个预测提升将给定谓词的匹配项放在结果列表中较高的位置。然后使用字段排序对得分相同的结果进行排序。
这应该可以解决问题:
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
带有本地 lucene 的 Hibernate Search 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);
我想搜索这两个字段,结果按 number 排序。但是,我还想在搜索结果顶部显示与关键字的完全匹配。 (关键字是唯一的)
为了达到这个目的,我应该怎么做? 我是否需要将搜索功能分成两个不同的查询然后合并它们?或者有更好的做法吗?
使用 score
排序和每个预测提升将给定谓词的匹配项放在结果列表中较高的位置。然后使用字段排序对得分相同的结果进行排序。
这应该可以解决问题:
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