Как определить DSL-запрос с комбинациями логики AND & OR (логики OR внутри AND)? - PullRequest
1 голос
/ 02 мая 2019

Я бы хотел определить DSL-запрос, чтобы описать запрос в Lucene ниже:

q = role:(admin OR manager) AND priority:(high OR middle).

Я знаю, что могу использовать should для обозначения логики OR, однакоЗапрос DSL ниже:

{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "role": "admin"
          }
        },
        {
          "match": {
            "role": "manager"
          }
        },
        {
          "match": {
            "priority": "high"
          }
        },
        {
          "match": {
            "priority": "middle"
          }
        }
      ],
      "minimum_should_match": "2"
    }
  }
}

не может достичь того, что мне нужно, так как данные

{
  "role": [ "admin", "manager"],
  "priority": "low"
}

будут считаться действительными, но они НЕ ДЕЛАЮТ.

Как я могу исправить свой запрос DSL?Я использую ElasticSearch 5.2.2, спасибо!

1 Ответ

1 голос
/ 02 мая 2019

Вам нужно сделать это так:

{
  "query": {
    "bool": {
      "filter": [
        {
          "bool": {
            "minimum_should_match": "1",
            "should": [
              {
                "match": {
                  "role": "admin"
                }
              },
              {
                "match": {
                  "role": "manager"
                }
              }
            ]
          }
        },
        {
          "bool": {
            "minimum_should_match": "1",
            "should": [
              {
                "match": {
                  "priority": "high"
                }
              },
              {
                "match": {
                  "priority": "middle"
                }
              }
            ]
          }
        }
      ]
    }
  }
}
...