Elastic Search / Hibernate Search:如何使用 java 中的查询 DSL API 对异或运算符进行编码?
Elastic Search / Hibernate Search : how to code xor operator with query DSL API in java?
我正在使用休眠搜索 java API 生成弹性搜索查询。我在编写异或运算符时遇到问题。通常我写道:
private void applyXorOperator(BooleanPredicateClausesStep<?> boolClausesAppender,
BooleanPredicateClausesStep<?> firstBool,
BooleanPredicateClausesStep<?> secondBool) {
boolClausesAppender.should(
boolClausesAppender.must(firstBool).mustNot(secondBool));
boolClausesAppender.should(
boolClausesAppender.mustNot(firstBool).must(secondBool));
boolClausesAppender.minimumShouldMatchNumber(1);
}
我期待的是“不是两者”怎么说:
boolClausesAppender.maximumShouldMatchNumber(1);
但 API 中不存在此方法。有什么解决办法吗?
谢谢。
根据定义:
a XOR b <=> (a AND NOT b) OR (NOT a AND b)
所以就这样实现吧:
private void applyXorOperator(BooleanPredicateClausesStep<?> boolClausesAppender,
BooleanPredicateClausesStep<?> firstBool,
BooleanPredicateClausesStep<?> secondBool) {
SearchPredicate a = firstBool.toPredicate();
SearchPredicate b = secondBool.toPredicate();
boolClausesAppender.should(f -> f.bool()
// a AND NOT b
.should(f.bool().must(a).mustNot(b))
// OR (NOT a AND b)
.should(f.bool().mustNot(a).must(b)));
}
编辑:顺便说一句,您不需要 first/second 成为布尔谓词。这也行,而且看起来更简单:
private void applyXorOperator(BooleanPredicateClausesStep<?> boolClausesAppender,
PredicateFinalStep first,
PredicateFinalStep second) {
SearchPredicate a = first.toPredicate();
SearchPredicate b = second.toPredicate();
boolClausesAppender.should(f -> f.bool()
// a AND NOT b
.should(f.bool().must(a).mustNot(b))
// OR (NOT a AND b)
.should(f.bool().mustNot(a).must(b)));
}
我正在使用休眠搜索 java API 生成弹性搜索查询。我在编写异或运算符时遇到问题。通常我写道:
private void applyXorOperator(BooleanPredicateClausesStep<?> boolClausesAppender,
BooleanPredicateClausesStep<?> firstBool,
BooleanPredicateClausesStep<?> secondBool) {
boolClausesAppender.should(
boolClausesAppender.must(firstBool).mustNot(secondBool));
boolClausesAppender.should(
boolClausesAppender.mustNot(firstBool).must(secondBool));
boolClausesAppender.minimumShouldMatchNumber(1);
}
我期待的是“不是两者”怎么说:
boolClausesAppender.maximumShouldMatchNumber(1);
但 API 中不存在此方法。有什么解决办法吗?
谢谢。
根据定义:
a XOR b <=> (a AND NOT b) OR (NOT a AND b)
所以就这样实现吧:
private void applyXorOperator(BooleanPredicateClausesStep<?> boolClausesAppender,
BooleanPredicateClausesStep<?> firstBool,
BooleanPredicateClausesStep<?> secondBool) {
SearchPredicate a = firstBool.toPredicate();
SearchPredicate b = secondBool.toPredicate();
boolClausesAppender.should(f -> f.bool()
// a AND NOT b
.should(f.bool().must(a).mustNot(b))
// OR (NOT a AND b)
.should(f.bool().mustNot(a).must(b)));
}
编辑:顺便说一句,您不需要 first/second 成为布尔谓词。这也行,而且看起来更简单:
private void applyXorOperator(BooleanPredicateClausesStep<?> boolClausesAppender,
PredicateFinalStep first,
PredicateFinalStep second) {
SearchPredicate a = first.toPredicate();
SearchPredicate b = second.toPredicate();
boolClausesAppender.should(f -> f.bool()
// a AND NOT b
.should(f.bool().must(a).mustNot(b))
// OR (NOT a AND b)
.should(f.bool().mustNot(a).must(b)));
}