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

ElasticSearch: Влияние установки поля "not_analyzed" как "store": "yes"?

Предположим, что у меня есть поле строки, указанное как not_analyzed в отображении. Если я затем добавлю "store":"yes" к отображению, будет ли ElasticSearch дублировать хранилище? Мое понимание полей not_analyzed заключается в том, что они не запускаются через анализатор, индексированный как есть, но клиент может сравниться с ним. Итак, если поле равно not_analyzed и store:yes, это может привести к тому, что ElasticSearch сохранит две копии строки.

Мой вопрос:

  • Если строковое поле хранится как not_analyzed и store:yes, будет ли дублирующее хранилище строки?

Я надеюсь, что это достаточно ясно. Спасибо!

4b9b3361

Ответ 1

Вы смешиваете концепцию проиндексированного поля и сохраненного поля в lucene, библиотеку, которую elasticsearch строится поверх.

Поле индексируется, когда оно входит в инвертированный индекс, структуру данных, которую использует lucene, чтобы обеспечить свои возможности быстрого и полного полнотекстового поиска. Если вы хотите искать в поле, вам нужно его проиндексировать. Когда вы индексируете поле, вы можете решить, хотите ли вы его индексировать, или хотите его проанализировать, что означает принятие к нему токенизатора, который будет генерировать список токенов (слов) и список токенов фильтры, которые могут изменять сгенерированные токены (даже добавлять или удалять некоторые). То, как вы индексируете поле, влияет на то, как вы можете его искать. Если вы индексируете поле, но не анализируете его, и его текст состоит из нескольких слов, вы сможете найти этот документ только для поиска именно того конкретного текста, включая пробелы.

Поле сохраняется, когда вы хотите получить его. Пусть, скажем, Lucene также предоставляет какое-то хранилище, которое не имеет никакого отношения к самому инвертированному индексу. При поиске с использованием lucene вы возвращаете список идентификаторов документов, которые соответствуют. Затем вы можете получить некоторый текст из своих сохраненных полей, что вы буквально показываете в качестве результатов поиска. Если вы не храните поле, вы никогда не сможете его вернуть из lucene (это не верно для elasticsearch, хотя, как я объясню ниже).

У вас могут быть поля, которые вы хотите искать, и никогда не показывать: индексированные и не сохраненные (по умолчанию в lucene).
У вас могут быть поля, которые вы хотите искать, а также извлекать: индексированные и сохраненные.
У вас могут быть поля, которые вы не хотите искать, но вы хотите их отобразить.

Поэтому две структуры данных не связаны друг с другом. Если вы индексируете и сохраняете поле в lucene, его содержимое не будет присутствовать дважды в той же форме. Сохраненные поля сохраняются так же, как и они, по мере их отправки в lucene, в то время как индексированные поля могут быть проанализированы и будут частью инвертированного индекса, что является чем-то другим. Сохраненные поля создаются для получения определенного документа (по идентификатору lucene document), в то время как индексированные поля создаются для поиска в такой структуре, которая буквально инвертирует текст, в результате которого каждый термин как ключ вместе со списком документов ids, которые содержат его (список проводок).

Когда дело доходит до elasticsearch, все меняется немного. Когда вы не настроите поле, которое хранится в вашем сопоставлении (по умолчанию это store:no), вы можете получить его в любом случае по умолчанию. Это происходит потому, что elasticsearch всегда хранит в lucene весь исходный документ, который вы отправляете ему (если вы не отключите эту функцию) в специальном поле lucene, называемом _source.

При поиске с использованием elasticsearch вы возвращаете по умолчанию все поле источника, но вы также можете запросить конкретные поля. Что происходит в этом случае, так это то, что elasticsearch проверяет, хранятся ли эти конкретные поля или нет в lucene. Если они являются содержимым, будут получены из lucene, в противном случае сохраненное поле _source будет извлечено из lucene, проанализировано как json (разбор тяги), и эти конкретные поля будут извлечены. В первом случае это может быть немного быстрее, но не обязательно. Если ваш источник действительно большой, и вы хотите загрузить только пару полей, их настройка в lucene, возможно, ускорит процесс загрузки; с другой стороны, если ваш _source не такой большой, и вы хотите загрузить много полей, то, вероятно, лучше загрузить только одно сохраненное поле (_source), что приведет к поиску одного диска, проанализирует его и т.д. В большинстве случаев использование поля _source отлично работает.

Чтобы ответить на ваш вопрос: инвертированный индекс и хранилище lucene - это две совершенно разные вещи. Вы получаете две копии одних и тех же данных в lucene только в том случае, если вы решили сохранить поле (store:yes в сопоставлении), так как elasticsearch сохраняет то же содержимое внутри json _source, но это не имеет ничего общего с сделайте то, что вы индексируете или анализируете поле.