Hibernate Search 5 BooleanJunction 有一個有用的 isEmpty() 方法,您可以確定是否確實存在任何子句。這有助于構建我們不會包含的上游 b/c 查詢,或者如果特定的 BooleanJunction 為空,則會更改我們的查詢,因為它不會提供所需的結果。
Hibernate Search 6 中 BooleanPredicateClausesStep 的等價物是什么?我沒有看到,那么是否有另一種方法來確定 BooleanPredicateClausesStep 是否為空或其中沒有包含子句?
提供一些示例代碼來說明。
休眠搜索 5.10.7.Final:
public Query buildProbableVendorNamesQuery(FullTextSession fts, QueryBuilder qb, Set<String> vendorNames) {
BooleanJunction namesBool = qb.bool();
vendorNames.forEach(name ->
addProbableVendorNameBool(fts, qb, namesBool, name)
);
return namesBool.isEmpty() ? null : namesBool.createQuery();
}
Hibernate Search 6.1.5.Final:
public SearchPredicate buildProbableVendorNamesPredicate(SearchPredicateFactory pf, Set<String> vendorNames) {
BooleanPredicateClausesStep namesBool = pf.bool();
vendorNames.forEach(name ->
addProbableVendorNameBool(pf, namesBool, name)
);
//TODO: How can we know if namesBool is empty so we can return null?
return namesBool.toPredicate();
}
namesBool 可能為空的原因有多種,1 是名稱本身最終成為停用詞或規范化為空。在這種情況下,我們希望通知上游呼叫者 SearchPredicate 為空,因此不要嘗試在查詢中使用它。
uj5u.com熱心網友回復:
目前在 Hibernate Search 6 中沒有等價物。我創建了HSEARCH-4618來解決這個問題;如果你很快想要這個功能,你可以考慮貢獻,因為這是對 Hibernate Search 的第一個相對容易的貢獻。
同時,您可以將ListtoaddProbableVendorNameBool作為解決方法。雖然不是很漂亮,但它會起作用:
public SearchPredicate buildProbableVendorNamesPredicate(SearchPredicateFactory pf, Set<String> vendorNames) {
List<SearchPredicate> clauses = new ArrayList();
vendorNames.forEach(name ->
addProbableVendorNameBool(pf, clauses, name)
);
if (clauses.isEmpty()) {
return null;
}
BooleanPredicateClausesStep namesBool = pf.bool();
clauses.forEach(namesBool::should);
return namesBool.toPredicate();
}
private void addProbableVendorNameBool(SearchPredicateFactory pf, List<SearchPredicate> clauses, String name) {
...
}
或者,如果您可以更改addProbableVendorNameBool以使其恰好回傳一個謂詞(例如,如果需要,讓它創建自己的布爾謂詞)或null:
public SearchPredicate buildProbableVendorNamesPredicate(SearchPredicateFactory pf, Set<String> vendorNames) {
List<SearchPredicate> clauses = vendorNames.stream()
.map(name -> buildProbableVendorSingleNamePredicate(pf, name))
.filter(Objects::nonNull)
.collect(Collectors.toList());
if (clauses.isEmpty()) {
return null;
}
BooleanPredicateClausesStep namesBool = pf.bool();
clauses.forEach(namesBool::should);
return namesBool.toPredicate();
}
private SearchPredicate buildProbableVendorSingleNamePredicate(SearchPredicateFactory pf, String name) {
...
return <something or null>;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/498181.html
