Подтвердить что ты не робот

Поиск по размеру типа объекта поле эластичный поиск

У меня есть такое отображение:

{
  "post": {
    "properties": {
      "author_gender": {
        "type": "string",
        "index": "not_analyzed",
        "omit_norms": true,
        "index_options": "docs"
      },
      "author_link": {
        "type": "string",
        "index": "no"
      },
      "content": {
        "type": "string"
      },
      "mentions": {
        "properties": {
          "id": {
            "type": "integer"
          },
          "name": {
            "type": "string"
          },
          "profile_image_url": {
            "type": "string"
          },
          "screen_name": {
            "type": "string"
          }
        }
      }
   }
}

Мне нужно выполнить поиск по размеру объекта mentions. Я пробовал это:

{
  "filter": {
    "script": {
      "script": "doc['mentions'].values.length == 2"
    }
  }
}

Это не работает. Выдает ошибку

inested: ElasticSearchIllegalArgumentException [Поле не найдено для [упоминает] при сопоставлении типов [post]];

Я также попытался заменить часть script на doc['mentions.id'].value.length == 2. Это также ошибка

вложен: ArrayIndexOutOfBoundsException [10];

Как запрашивать записи с mentions размером объекта 2?

4b9b3361

Ответ 1

В справочнике elasticsearch рекомендуется использовать size() вместо длина для объектов. Поэтому попробуйте следующее:

{
 "filter": {
   "script": {
     "script": "doc['mentions.id'].values.size() == 2"
    }
  }
}

Все самое лучшее.

Ответ 2

ElasticSearch не будет хранить массив объектов, как вы думаете. Вместо этого для каждого свойства объекта сохраняются несколько массивов.

Итак, почему вы должны использовать "вспомогательный массив".