Elasticseach существует запрос на тип объекта возвращает 0 результатов - PullRequest
2 голосов
/ 15 января 2020

[UPD] Elasticsearch версия 5.6

У меня есть следующее отображение, определенное в foo_index:

{
    "foo": { 
        "properties": {
            "bar": { 
               "type": "object",
               "dynamic": false
            }
            ...
        } 
    } 
}

Некоторые документы в foo_index содержат bar свойство с произвольным json данных, а другие нет. Таким образом, документы, хранящиеся в foo_index, выглядят следующим образом:

[
    { bar: { arbitrary: { json: 1 } }, ... },
    { bar: { arbitrary: { json: 2 } }, ... },
    { ... }, // bar property is absent,
    { bar: { arbitrary: { json: 3 } }, ... }
]

Когда я выполняю следующий запрос для выборки только тех объектов, которые содержат bar свойство, я получаю 0 результатов:

GET foo_index/foo/_search
{
    "query": {
        "exists": {
            "field": "bar"
        }
    }
}

Почему этот запрос не работает? Я ожидаю, что он вернет foo документов, которые содержат bar свойство.

1 Ответ

3 голосов
/ 15 января 2020

Причина, по которой вы не можете просматривать документы, заключается в том, что вы установили поле dynamic: false в своем отображении.

Таким образом, когда вы делаете это, вы в основном говорите эластичный поиск не создавать отдельный инвертированный индекс для этого поля. По сути, это поле, хотя и существует в документе, оно не будет полем для поиска. В результате ни один запрос не будет применим к этому полю. Другими словами, ES будет вести себя так, как будто такого поля нет.

Как упомянуто в этой ссылке , у нас есть ниже, когда она установлена ​​в false

Вновь обнаруженные поля игнорируются. Эти поля не будут проиндексированы, поэтому не будут доступны для поиска, но все равно будут отображаться в поле _source возвращаемых совпадений. Эти поля не будут добавлены в отображение, новые поля должны быть добавлены явно.

В основном измените ваше отображение ниже:

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

PUT foo_index
{
  "mappings": {
    "foo":{
      "properties": {
        "bar":{
          "type": "object"
        }
      }
    }
  }
}

Запрос Exists будет работать нормально, если вы удалите это поле в своем отображении.

Обратите внимание, что вам нужно будет удалить свой индекс, заново создать индекс с изменением в отображении, повторно принять документы и затем выполнить запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...