Elasticsearch 2.4, фильтр Exists для вложенных объектов не работает

Мое отображение:

"properties": {
  "user": {
    "type": "nested",
    "properties": {
      "id": {
        "type": "integer"
      },
      "is_active": {
        "type": "boolean",
        "null_value": false
      },
      "username": {
        "type": "string"
      }
    }
  },

Я хочу получить все документы, в которых нет поля user.

Я попытался:

GET /index/type/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "exists": {
            "field": "user"
          }
        }
      ]
    }
  }
}

Который возвращает все документы. На основе ElasticSearch 2.x существует фильтр для вложенного поля не работает, я также пробовал:

GET /index/type/_search
{
  "query": {
    "nested": {
      "path": "user",
      "query": {
        "bool": {
          "must_not": [
            {
              "exists": {
                "field": "user"
              }
            }
          ]
        }
      }
    }
  }
}

Который возвращает 0 документов.

Каков правильный запрос, чтобы получить все документы, в которых отсутствует поле user?


person pmishev    schedule 21.12.2016    source источник
comment
Можете ли вы вместо этого попробовать проверить существование поля user.id? Если в родительском документе нет поля user, то в нем также не будет поля user.id.   -  person Val    schedule 21.12.2016
comment
Я предполагаю, что это будет работать достаточно хорошо, но будет пропущен крайний случай, когда пользователь установлен, но пуст.   -  person pmishev    schedule 04.01.2017


Ответы (2)


Я нашел правильный синтаксис, он должен был быть:

GET /index/type/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "nested": {
            "path": "user",
            "query": {
              "exists": {
                "field": "user"
              }
            }
          }
        }
      ]
    }
  }
}
person pmishev    schedule 04.01.2017
comment
Я искал этот синтаксис некоторое время, большое спасибо! - person Oleg Kyrylchuk; 11.01.2019
comment
Это кажется правильным, поэтому +1, но, похоже, нет никакой логики в том, почему это должно быть именно так! Кажется, в документах нет ничего о том, почему это должно быть так. - person Rich Smith; 03.04.2019
comment
Спасибо !! Работал как шарм - person Malkeith Singh; 22.05.2019

Попробуйте использовать родителя пользователя, здесь obj

GET users/users/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "exists": {
            "field": "obj.user"
          }
        }
      ]
    }
  }
}   
person Ryadh Khsib    schedule 21.12.2016
comment
у пользователя нет родителя - это поле в документе, а не во вложенном объекте - person pmishev; 04.01.2017