如何使用 Spring Data Elasticsearch 通过 OR 逻辑创建对 Elasticsearch 的复杂查询?

How to create complex query to Elasticsearch with OR logic using Spring Data Elasticsearch?

我正在寻找使用 java 中的 OR 逻辑对 Elasticsearch 进行复杂查询的最佳方法。

我真的需要 ((A 和 B) 或 (C 和 D) 或 (E 和 F 和 G))

现在我使用 ElasticsearchTemplate 和 org.springframework.data.elasticsearch.core.query.Criteria.class

但是我无法在一个查询中实现 OR 逻辑,我必须对 Elasticsearch 进行单独的请求:

elasticSearch 中的 AND 是 Must,OR 是 Should,你也得到了 MustNot for AND NOT

您可以使用布尔查询将它们连接起来,就像这个例子https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html

您可以使用布尔查询对 OR 和 AND 查询建模:

在你的例子中是:

boolQuery().should(boolQuery().must(A).must(B)) .should(boolQuery().must(C).must(D)) .should(boolQuery().must(E).must(F).must(G));

更新:抱歉我的逻辑有误,由于 AND 运算符优先于 OR 运算符,只需删除括号即可

我认为以下逻辑可行

((A and B) or (C and D) or (E and F and G)) = A and B or C and D or E and F and G

这目前是不可能的,有一个Jira issue。这是我想尽快解决的问题之一,但目前我们正在努力准备好 4.0 版本。

唉,这需要对 Criteria class 进行整体重写才能具有此功能,但当然我们不能破坏现有功能。所以这不是可以通过快速修复来完成的事情(否则我已经在去年 12 月修复了它)。