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)));
}