Запрос Elasticsearch для случая, когда первичное поле не существует, а не вложенное - PullRequest
0 голосов
/ 18 июня 2020

У меня проблема с запросом es в случае, когда первичное поле не существует, а не вложенное. У меня есть эти данные:

[
    {
        "id": "1",
        "offers": [
            {
                "id": "777",
                "offers": null,
                "name": "Apple"
            }
        ]
    },
    {
        "id": "2",
        "offers": null
    }
]

, и мне нужно получить элемент, в котором основное поле offers не существует или равно null (те, у которых есть id=2), а не вложенное (id=1) .

Я ожидал, что будет работать следующий фильтр:

    "query": {
        "bool": {
            "must_not": {
                "bool": {
                    "must": [
                        {
                            "exists": {
                                "field": "offers"
                            }
                        }
                    ]
                }
            }
        }
    }

Но этот фильтр дает мне элемент с id = 1, где вложенный offers равен нулю. Как получить элемент, в котором не существует именно первичного поля (id=2), а не вложенного?

Ответы [ 2 ]

0 голосов
/ 21 июня 2020

offers - это вложенный тип поля. Это важная вещь, о которой я не знал. Я нашел ответ здесь . Итак, в моем случае вот запрос, который работает и который дает элемент, в котором не существует основного поля (id = 2), а не вложенного (id = 1):

{
    "from": 0,
    "size": 1,
    "query": {
        "bool": {
            "must_not": [
                {
                    "nested": {
                        "path": "offers",
                        "query": {
                            "bool": {
                                "filter": {
                                    "exists": {
                                        "field": "offers"
                                    }
                                }
                            }
                        }
                    }
                }
            ]
        }
    }
}
0 голосов
/ 18 июня 2020

Попробуйте следующее:

{
  "query":{
    "bool":{
      "must_not":{
        "bool":{
          "must":[
            {
              "exists":{
                "field":"offers.id"
              }
            }
          ]
        }
      }
    }
  }
}
...