【问题标题】:Elasticsearch bool query with multiple and/or flows具有多个和/或流的 Elasticsearch 布尔查询
【发布时间】:2016-05-06 23:00:11
【问题描述】:

我正在尝试使用 elasticsearch 查询 DSL 编写下面提到的 SQL 查询,但我无法获得与 SQL 查询相同的结果。任何人都可以帮助 e 处理下面提到的案例的 bool 查询。我使用的是 elasticsearch 2.1.1 版本。

id.eq(someId)
  .and(
     (anotherId.eq(another).and(node.eq(node)))
     .or
     (domain.in(List))
    )

这是我尝试过的。如果这是正确的,我如何在 Java DSL 中编写相同的查询?

{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must": [
            {
              "term": {
                "id": 1
              }
            }
          ]
        }
      },
      "query": {
      "bool": {
         "should": [
            {
               "bool": {
                  "must": [
                     {
                        "term": {
                           "anotherId": "ss"
                        }
                     },
                     {
                        "term": {
                           "node": "ss"
                        }
                     }
                  ]
               }
            },
            {
               "bool": {
                  "must": [
                     {
                        "terms": {
                           "domain" : [ "cc", "cc" ]
                        }
                     }
                  ]
               }
            }
         ]
      }
   }
    }
  }
}

【问题讨论】:

标签: elasticsearch


【解决方案1】:

这是在 ES 2.1.1 中正确的做法

{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "id": 1
          }
        },
        {
          "bool": {
            "should": [
              {
                "bool": {
                  "filter": [
                    {
                      "term": {
                        "anotherId": "ss"
                      }
                    },
                    {
                      "term": {
                        "node": "ss"
                      }
                    }
                  ]
                }
              },
              {
                "terms": {
                  "domain": [
                    "cc",
                    "cc"
                  ]
                }
              }
            ]
          }
        }
      ]
    }
  }
}

【讨论】:

  • 完美运行。您能否在下面查看我的查询,看看我是否朝着正确的方向前进?我无法级联最后的条款查询。 QueryBuilders.boolQuery().should((QueryBuilders.boolQuery().must(QueryBuilders.termQuery(ANOTHER_ID, "ss")) .must(QueryBuilders.termsQuery(NODE, "ss"))).must(QueryBuilders.boolQuery( ).must(QueryBuilders.termsQuery(DOMAIN,["cc", "cc"]))));
【解决方案2】:

从外观上看,您可能会在第一个 should 之前关闭第一个 bool 查询。 如果您将查询分成不同的行:

id.eq(someId)
  .and(
     (anotherId.eq(another).and(node.eq(node)))
     .or
     (domain.in(List))
    )

了解如何构建 ElasticSearch 查询要容易得多:

{ 
    "bool" : { 
        "must": [
            { "term": { "id": 15 } },
            { "bool": {
                "should": [
                    { "bool": {
                        "must": [
                            { "term": { "anotherId": "dd" } },
                            { "terms": { "node": [ "ff" ] } }
                            ]
                        }
                    },
                    { "terms": { "domain": [ "nn", "nn" ] } }
                ]
             }
            }
         ]
     }
}

希望括号正确关闭 :) 如果不是,请告诉我,并尝试纠正它们。

【讨论】:

  • 感谢您的回复。看起来 json 对于不正确的大括号无效。而且我正在使用 elasticsearc 2.1.1 版本,其中过滤查询已被弃用(Java API)。
  • @Val:你能帮我解决这个问题吗?
  • 我看到你已经得到了正确的答案。只有几个不匹配的{。现在应该也可以了。
  • 这也有效!我使用 Java API 编写了相同的查询。请参考下文。它可能会帮助某人。如果它不起作用,请告诉我。
【解决方案3】:

上面提到的两个标记为答案的查询都可以正常工作。如果有人想知道如何使用 Java API 进行必须/应该嵌套,请参考这个答案。如果它没有按预期工作,请告诉我。

QueryBuilders.boolQuery().must(QueryBuilders.termQuery(ID1, associationId)).must(QueryBuilders.boolQuery().should(QueryBuilders.boolQuery()
                        .must(QueryBuilders.termQuery(Another_ID, "cc")).must(QueryBuilders.termsQuery(NODE, "cc")))
                        .should(QueryBuilders.termsQuery(DOMAIN, ["cc","cc"])));

或者:

QueryBuilders.boolQuery().filter(QueryBuilders.termQuery(ID1, associationId)).filter(QueryBuilders.boolQuery().should(QueryBuilders.boolQuery()
                        .must(QueryBuilders.termQuery(Another_ID, "cc")).must(QueryBuilders.termsQuery(NODE, "cc")))
                        .should(QueryBuilders.termsQuery(DOMAIN, ["cc","cc"])));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-28
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    相关资源
    最近更新 更多