Объединение отсутствующего и термина запроса в вложенном документе в Elasticsearch - PullRequest
0 голосов
/ 02 января 2019

У меня есть эти 3 документа, где fields имеет тип nested:

{
  "fields": [
    {"field_id": 23, "value": "John Doe"},
    {"field_id": 92, "value": null}
  ]
}

{
  "fields": [
    {"field_id": 23, "value": "Ada Lovelace"},
  ]
}

{
  "fields": [
    {"field_id": 23, "value": "Jack Daniels"},
    {"field_id": 92, "value": "jack@example.com"}
  ]
}

Мне нужно найти документы, где:

(`field_id` = `92` AND `value` is `null`) OR (`field_id` `92` is missing.)

Объединение терминов иОтсутствующий запрос приводит к тому, что возвращается только документ со значением null:

...
"nested": {
  "path": "fields",
  "filter": {
    "bool": {
      "bool": {
        "must": [
          {
            "missing": {
              "field": "fields.value"
            }
          },
          {
            "terms": {
              "fields.field_id": [92]
            }
          }
        ]
      }
    }
  }
}
...

Как я могу это сделать?

1 Ответ

0 голосов
/ 04 января 2019

У вас уже есть запрос для одного условия. Давайте назовем это A . Для второго условия проверьте для fields.field_id: 92 во вложенных документах. Допустим, это B . Но ваше состояние fields.field_id: 92 не должно существовать. Таким образом, для достижения этой обертки B в must_not. т.е. B '

Требуется A ИЛИ B '

Таким образом, окончательный запрос будет:

{
  "query": {
    "bool": {
      "should": [
        {
          "nested": {
            "path": "fields",
            "query": {
              "bool": {
                "must": [
                  {
                    "term": {
                      "fields.field_id": 92
                    }
                  }
                ],
                "must_not": [
                  {
                    "exists": {
                      "field": "fields.value"
                    }
                  }
                ]
              }
            }
          }
        },
        {
          "bool": {
            "must_not": [
              {
                "nested": {
                  "path": "fields",
                  "query": {
                    "term": {
                      "fields.field_id": 92
                    }
                  }
                }
              }
            ]
          }
        }
      ]
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...