【问题标题】:How to create complex query to Elasticsearch with OR logic using Spring Data Elasticsearch?如何使用 Spring Data Elasticsearch 使用 OR 逻辑创建对 Elasticsearch 的复杂查询?
【发布时间】:2020-02-27 08:02:01
【问题描述】:

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

我真的需要 ((A and B) or (C and D) or (E and F and G)))

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

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

  • 一个用于(A 和 B),
  • 一个用于(C 和 D),依此类推...

【问题讨论】:

    标签: java elasticsearch spring-data-elasticsearch


    【解决方案1】:

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

    在你的例子中是:

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

    【讨论】:

    • 谢谢。那条消息和上一条消息使我走上了正确的道路。我只是无法让自己相信没有办法用 Criteria 做嵌套条件。真正的疏忽,恕我直言。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      您可以使用 bool 查询连接它们,例如 https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html 示例

      【讨论】:

        【解决方案4】:

        更新:对不起,我的逻辑有误,因为 AND 运算符优先于 OR 运算符,只需删除括号即可

        我认为下面的逻辑会起作用

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

        【讨论】:

          猜你喜欢
          • 2017-12-24
          • 2022-12-11
          • 2017-12-06
          • 2016-10-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-08-27
          • 2016-12-26
          相关资源
          最近更新 更多