Как определять эффективность маппинга в Elasticsearch

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

Elasticsearch

Elasticsearch не навязывает строгую структуру для документов - любой документ может быть сохранен. Документ можно рассматривать как эквивалент строки или записи в реляционной базе данных. Когда мы индексируем документ, создается отображение данных. Каждое поле в отображении может быть либо полем метаданных, либо добавленным пользовательским полем. Существуют различные типы полей отображения для определения различных типов полей.

Динамический маппинг VS. статический маппинг

В Elasticsearch существует два различных варианта маппинга.

Динамический мапинг: При динамическом отображении вы индексируете документ без определения отображений. Новые поля добавляются на верхний уровень. Это помогает индексировать данные без определения структуры.

Следующие конфигурации помогут оптимизировать операции индексирования:

  • Включите date_detection и установите dynamic_date_formats.
  • По умолчанию функция определения даты включена, сохраняя данные "created_on": "2021/01/01" будут сохраняться в формате по умолчанию ["strict_date_optional_time", "yyyy/MM/dd HH:mm:ss Z||yyyy/MM/dd Z"]. Используйте пользовательский формат по мере необходимости с помощью "dynamic_date_formats": ["MM/dd/yyyy"]. Отключение приведет к сохранению даты в текстовом формате.
  • Включить определение числовых значений, numeric_detection: true

По умолчанию функция numeric_detection отключена, при сохранении данных "experience_in_years": "10" будет сохранено в текстовом формате. Включение функции numeric_detection приведет к сохранению данных в формате float (значение равно 1.0) или long (значение равно 1).

  • Пользовательские анализаторы должны быть протестированы с помощью API анализатора перед запуском. Стандартные анализаторы поддерживаются "из коробки" для естественных языков.
  • Coerce - операции индексирования будут неудачными, если индексируются грязные значения. Например, если вы пытаетесь сохранить число "10", оно будет сохранено либо как плавающая точка, либо как строка, но не как целое число. Чтобы заставить поле быть строгим, вы можете использовать coerce на уровне индекса или на уровне поля.
  • Вы можете настроить поле так, чтобы оно не индексировалось, если длина строки слишком велика и превышает необходимое количество символов. ignore_above может быть настроено в соответствии с требованиями вашей системы. Вы можете настроить поле не индексироваться, если документ содержит неправильные данные, используя "ignore_malformed": true.

Динамический мапинг будет давать плохие результаты при неосознанном индексе документа. Это поведение можно отключить как на уровне документа, так и на уровне объекта, установив параметр dynamic в false (чтобы игнорировать новые поля) или strict (чтобы выбрасывать исключение, если встречается неизвестное поле). По умолчанию используется значение true.

Статический мапинг: При статическом (мапинге) ,структура определяется до индексирования документа. Все новые поля добавляются с помощью API PUT Mappings.

Text VS keyword

Text - Поле типа text пройдет через текстовый анализ, а затем будет проиндексировано в инвертированный индекс. По умолчанию Elasticsearch использует стандартный анализатор.

Текст токенизируется на 9 токенов со следующим форматом JSON для каждого токена, пример ниже показывает токен:

Elasticsearch позволяет создавать пользовательские анализаторы с комбинацией различных фильтров, токенизаторов и char-фильтров.

Keyword - Поле типа ключевое слово будет индексироваться так, как его задал клиент, и в инвертированном индексе оно будет представлять собой однострочный текст.

Пример использования:

Поиск будет работать для ключевых слов с запросами точного соответствия, в то время как текст используется для полнотекстового поиска или для автозаполнения. Анализируемые и неанализируемые строки в процессе индексирования и запроса будут давать разные результаты в поиске.

Индекс по типу документа

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

Индексирование документов разных типов отображения в один индекс, например, индексирование customer_order и customer_reviews в один индекс приведет к избыточности, когда у нас есть несколько вызовов с одним и тем же customer_order, что приведет к разбросанности данных или разрозненности документов. Поэтому рекомендуется сохранять один тип отображения в один индекс. Начиная с версии Elasticsearch 6.0 по умолчанию индекс не позволяет использовать несколько типов в одном индексе. Лучший вариант - всегда иметь один тип документа в одном индексе. Единственная обязанность индекса - поддерживать один тип документа/тип отображения для каждого индекса.

Предотвращение "взрыва" маппинга - ограничение настроек

Неограниченное количество полей отображения может привести к взрыву отображения, что приведет к исключению Out_of_Memory. Вам следует обновить индексное отображение для ограничения полей в документе, чтобы предотвратить взрыв отображения. См. рекомендуемую конфигурацию полей ниже.

Ограничение общего количества полей

Установите общее количество полей с помощью index.mapping.total_fields.limit - по умолчанию это 1000.

Определите максимальную глубину поля

  • Все поля в корне, depth=1
  • Если существует отображение объекта на поле, depth=1

Установите значение index.mapping.depth.limit, чтобы задать желаемый предел. Значение по умолчанию равно 20.

Определение максимального предела вложенного поля

Вложенные поля используются, когда массив или объект нужно проиндексировать или запросить. Лучшая практика - определить количество вложенных отображений. Вы можете установить значение index.mapping.nested_fields.limit по своему усмотрению. По умолчанию это значение равно 50.

Определение максимального предела вложенных объектов

По умолчанию один документ может иметь максимум 10000 вложенных объектов по всем вложенным объектам. Установите предел вложенных объектов index.mapping.nested_objects.limit, чтобы ограничить вложенные объекты.

Все вышеперечисленные ограничения помогут предотвратить взрыв отображения. Вы можете ограничивать или расширять лимиты по мере необходимости, но при превышении лимитов по умолчанию.

Усиление времени запроса

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

Заключение

Elasticsearch устанавливает все настройки по умолчанию для основных требований развертывания, позволяя вам начать индексирование и поиск без обновления любого из вышеуказанных отображений. Чтобы настроить Elasticsearch под конкретные нужды, вы всегда должны применять мелкие изменения, необходимые для достижения лучшей производительности.

Понравилась статья? Поделиться с друзьями:
Добавить комментарий