Почему elasticsearch возвращает слишком разные результаты для одного и того же запроса по разным индексам?

Сначала я использую Elasticsearch и Kibana, поэтому, пожалуйста, не спешите отвечать на мой вопрос!

Мне дали ES, у которого уже был индекс под названием dai-* с предварительно загруженными данными. Чтобы безопасно поиграть с ES, я создал новый индекс под названием ad-prior. Затем я продолжил заполнять оба индекса данными, выглядящими так:

{'obj_id': 'UHDRXEWEEK', 'event_type': 'PREC_AD_STARTED', 'event_id': '5c6b584373d', 'timestamp': 1550540223736L, 'channel_id': '123456789'}
{'obj_id': 'FDREJJSSHE', 'event_type': 'PREC_AD_STARTED', 'event_id': '4f53jhabd24', 'timestamp': 1550540225872L, 'channel_id': '123456789'}

Затем я попытался выполнить поиск в Kibana's Discover:

event_type.keyword:PREC_AD_STARTED
event_type:PREC_AD_STARTED
event_type:'PREC_AD_STARTED'

Индекс dai-*: все вышеуказанные поиски возвращают 367 hits.

Индекс ad-prior: приведенные выше поиски дали разные результаты: event_type:PREC_AD_STARTED вернул 8 hits, а два других вернули 0 hits.

Почему приведенные выше поисковые запросы дали один и тот же результат для dai-*, а для ad-prior — разные результаты?

Обновить

Чтобы ответить на комментарий @Nishant Saini, я взял то, что я полагаю, для event_type здесь:

Для dai-*:

"event_type": {
  "type": "text",
  "fields": {
    "keyword": {
      "type": "keyword",
      "ignore_above": 256
    }
  }
}

Для ad-prior:

"event_type": {
  "type": "keyword",
  "ignore_above": 1024
}

person duong_dajgja    schedule 19.02.2019    source источник
comment
dai-* использует подстановочный знак, поэтому он нацелен на все индексы, начинающиеся с dia-. Является ли сопоставление нового индекса ad-prior таким же, как для этих dia-*?   -  person Nishant    schedule 19.02.2019
comment
@NishantSaini Я добавил больше деталей.   -  person duong_dajgja    schedule 19.02.2019


Ответы (1)


Случай 1: event_type.keyword:PREC_AD_STARTED

В индексе dia-* свойство event_type имеет подполе по имени keyword. Приведенный выше запрос относится к этому подполю, т.е. event_type.keyword. Для совпадения в dai-* возвращаются документы, тогда как это подполе отсутствует для поля event_type в индексе ad-prior и, следовательно, никаких результатов.

Случай 2: event_type:PREC_AD_STARTED

event_type присутствует в обоих индексах. Несмотря на то, что в индексе dai-* тип данных text и поскольку по умолчанию применяется стандартный анализатор, то PREC_AD_STARTED даст prec_ad_started. Приведенный выше запрос применяет тот же анализатор к входной строке, которая затем также преобразуется в prec_ad_started и, следовательно, соответствует документам.

В случае индекса ad-prior тип данных event_type равен keyword, поэтому входная строка индексируется как есть. Даже при поиске происходит то же самое, и, следовательно, приведенный выше запрос соответствует и в этом случае.

Поэтому этот запрос дает вам результат в случае обоих индексов.

Случай 3: event_type:'PREC_AD_STARTED'

Для индекса dai-*, поскольку запрос находится в поле event_type (не в event_type.keyword), которое имеет тип text (анализатор по умолчанию: стандартный), когда индексируется PREC_AD_STARTED, индексируемое значение равно prec_ad_started из-за стандартный анализатор. Приведенный выше запрос ищет 'PREC_AD_STARTED' (с одинарными кавычками). Даже эта строка будет пропущена через стандартный анализатор, который также преобразуется в prec_ad_started, и, следовательно, этот запрос соответствует.

В случае индекса ad-prior event_type имеет тип keyword, что означает индекс без каких-либо изменений. Поскольку мы запрашиваем поле event_type, запрос не будет применять анализатор (поскольку тип данных ключевое слово) и, следовательно, будет искать 'PREC_AD_STARTED' (не PREC_AD_STARTED) и, следовательно, совпадений нет.

person Nishant    schedule 19.02.2019
comment
Спасибо за четкое объяснение! Побочный вопрос: есть ли способ заставить ad-prior иметь то же отображение, что и dai-*? Или даже способ скопировать сопоставление с dai-* на ad-prior? - person duong_dajgja; 19.02.2019
comment
Вы можете использовать GET <index_name>/_mappings для получения сопоставлений индекса, а затем использовать PUT <new_index> для создания индекса с сопоставлением, которое вы получаете из API-интерфейса получения сопоставления. - person Nishant; 19.02.2019
comment
Также, пожалуйста, примите / проголосуйте, если ответ развеет ваши сомнения :) - person Nishant; 19.02.2019
comment
Да, и то, и другое :D - person duong_dajgja; 19.02.2019