如何在 Hibernate 搜索中搜索与过滤器匹配的查询结果
How to search for query results which also match a filter in Hibernate search
我正在使用带有弹性搜索后端的 Hibernate Search 6。
我正在使用以下内容搜索书名。
Search.session(entityManager)
.search(Book.class)
.predicate(f -> query == null || query.trim().isEmpty() ? f.matchAll()
: f.simpleQueryString()
.field("title")
.matching(query))
.fetchHits(10);
现在我的 Book 实体有一个布尔字段 inStock
。我希望我的休眠搜索结果只包含 inStock
为真的那些书。
我可以在结果列表的 java 中做一个过滤器,但这会破坏分页并且不像查询本身
中的东西那样优雅的解决方案
也许是这样的?
Search.session(entityManager).search(Book.class)
.predicate(f -> f.bool(b -> {
b.must(f.match().field("inStock").matching(true));
if (query != null && !query.trim().isEmpty()) {
b.must(f.simpleQueryString().field("title")
.matching(query));
}
}))
.fetchHits(10);
或者,如果 "inStock" 作为参数传递并且可能是 null
(表示 "no constraint on the stock status"):
Search.session(entityManager).search(Book.class)
.predicate(f -> f.bool(b -> {
b.must(f.matchAll()); // Match everything by default, if there are no constraints
if (inStock != null) {
b.must(f.match().field("inStock").matching(true));
}
if (query != null && !query.trim().isEmpty()) {
b.must(f.simpleQueryString().field("title")
.matching(query));
}
}))
.fetchHits(10);
参见this section of the documentation,尤其是最后一个例子("Easily adding clauses dynamically with the lambda syntax")
我正在使用带有弹性搜索后端的 Hibernate Search 6。
我正在使用以下内容搜索书名。
Search.session(entityManager)
.search(Book.class)
.predicate(f -> query == null || query.trim().isEmpty() ? f.matchAll()
: f.simpleQueryString()
.field("title")
.matching(query))
.fetchHits(10);
现在我的 Book 实体有一个布尔字段 inStock
。我希望我的休眠搜索结果只包含 inStock
为真的那些书。
我可以在结果列表的 java 中做一个过滤器,但这会破坏分页并且不像查询本身
也许是这样的?
Search.session(entityManager).search(Book.class)
.predicate(f -> f.bool(b -> {
b.must(f.match().field("inStock").matching(true));
if (query != null && !query.trim().isEmpty()) {
b.must(f.simpleQueryString().field("title")
.matching(query));
}
}))
.fetchHits(10);
或者,如果 "inStock" 作为参数传递并且可能是 null
(表示 "no constraint on the stock status"):
Search.session(entityManager).search(Book.class)
.predicate(f -> f.bool(b -> {
b.must(f.matchAll()); // Match everything by default, if there are no constraints
if (inStock != null) {
b.must(f.match().field("inStock").matching(true));
}
if (query != null && !query.trim().isEmpty()) {
b.must(f.simpleQueryString().field("title")
.matching(query));
}
}))
.fetchHits(10);
参见this section of the documentation,尤其是最后一个例子("Easily adding clauses dynamically with the lambda syntax")