Фильтрация источников OpenSearch, хранимые поля, поля и поля Docvalues

При выполнении поискового запроса возвращаемый ответ по умолчанию содержит массив из 10 хитов, включающий поле _source. Поле _source содержит JSON-документ, который хранился в момент индексации, то есть именно те данные, которые были получены.

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

Ниже мы рассмотрим, как вы можете контролировать содержимое поисковых результатов, включая важную справочную информацию о том, как OpenSearch хранит документы внутри.

Мы рассмотрим следующие методы:

  • _source
  • Stored fields (хранимые поля)
  • Поля (Fields)
  • Docvalue fields

Фильтрация источника

Во многих случаях источник _source содержит больше полей, чем требуется вашему приложению. Очень распространенной практикой является выбор возврата только частичного JSON-документа с помощью фильтрации источника.

_source принимает несколько параметров:

  • true (по умолчанию): весь документ будет возвращен в виде хита
  • false: в качестве хитов будут возвращены только метаданные (_index, _id, _score).
  • Список полей для возврата частичного JSON-документа: [<field_1>, <field_4>, ... ] *
  • Includes: список полей для включения *
  • Excludes: список полей для исключения (полезно для (вложенных) объектов) *

* Имена полей поддерживают параметр wildcard, что особенно полезно для фильтрации (вложенных) объектов.

Примеры

Создайте индекс с отображением по умолчанию и сохраните документ:

По умолчанию получает _source:

Отключить _source:

Фильтр _source:

Однако использование параметра _source не всегда является лучшим выбором с точки зрения производительности и функциональности. Есть несколько лучших вариантов, которые вы можете рассмотреть, как описано ниже.

Оптимизация производительности

Когда вы хотите отфильтровать возвращаемые поля, документ JSON должен быть разобран, отфильтрован и отправлен обратно вашему клиенту как часть ответа.

Кто-то должен разобрать JSON, будь то ваше приложение или OpenSearch.

Если вы позволите OpenSearch разбирать и фильтровать JSON-документ, это будет быстрее и легче масштабироваться, к тому же вы сэкономите сетевой трафик. Если ваши документы очень большие или глубоко вложенные, разбор JSON может быть оптимизирован.

Для этого случая есть лучшее решение: stored fields (хранимые поля).

Stored fields (хранимые поля)

Если вы хотите сэкономить время, которое OpenSearch тратит на разбор и фильтрацию JSON, вы можете использовать хранимые поля. Обратите внимание, что название и первый абзац официальной документации могут немного ввести в заблуждение.

Хранение полей позволяет загружать и отображать только те поля, которые вам нужны, и обходится без загрузки всего _source для каждого хита. Если вам действительно нужно оптимизировать производительность на этапе получения (фаза выборки поискового запроса), вы можете использовать хранимые поля. Это дополнительная структура данных Lucene. В основном она увеличивает дисковое пространство и частично дублирует данные JSON, которые уже хранятся в поле _source.

Как всегда, это зависит от требований вашего приложения - вы должны определить, важнее ли быстрый поиск, чем быстрое и "тонкое" хранение, или наоборот.

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

Эта функция особенно полезна для вложенных документов и помогает увеличить производительность при поиске.

Обратите внимание, что значения возвращаются в виде массива.

Примеры

Создайте индекс:

Добавьте документ:

Отключите _source, верните все сохраненные поля:

Вложенные хранимые поля могут быть возвращены только в пределах inner_hits:

Поля (Fields)

Если производительность не является проблемой, но вы хотите быть уверены, что возвращаемые значения имеют единый формат в соответствии с отображением, использование полей вместо _source является хорошим вариантом.

Он проверит отображение поля и использует эту информацию для переформатирования. OpenSearch довольно надежен и будет хранить что-то вроде этого:

"1", "12", "123"

как числовое значение, если отображение определено соответствующим образом.

Эта функция называется coerce и включена по умолчанию. Некоторые введенные вами данные могут иметь "неправильный" тип данных, и поля будут анализировать эти значения в соответствии с типом отображения и возвращать их в единообразном виде.

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

Это означает, что независимо от того, как даты хранились в источнике, вы можете просто изменить формат при необходимости, то же самое касается и геоданных.

Обратите внимание, что значения возвращаются в виде массива.

Примеры

Создайте отображение:

Сохраните документ:

Извлеките поля:

Сравните _source и field. Переформатируйте дату:

docvalue_fields

Еще один способ сделать поисковые запросы более эффективными и полностью избежать загрузки _source - использовать поля docvalue_fields.

doc_values хранятся на диске и хранят те же значения, что и _source, однако они обрабатываются кэшем файловой системы, поэтому находятся вне кучи Java. Эта структура данных оптимизирована для сортировки и агрегирования.

Вы можете использовать doc_values, используя эту информацию для получения значений полей, что позволяет полностью обойти _source. К сожалению, это нельзя использовать для типов text и annotated_text.

Обратите внимание, что значения возвращаются в виде массива.

Примеры

Создайте индекс с отображениями по умолчанию и добавьте документ:

Получите поля docvalue_fields:

Резюме - все варианты в двух словах

_source

  • По умолчанию, простой в использовании и гибкий.
  • Возвращает все содержимое в том виде, в котором вы его проиндексировали.
  • Парсинг JSON.

stored_fields

  • Требует дополнительного дискового пространства.
  • Требует дополнительных параметров отображения.
  • Повышает производительность чтения для глубоко вложенных полей.
  • Код для возврата вложенных полей довольно громоздкий.
  • Значения возвращаются в виде массива.

fields

  • Возвращает однородные значения, соответствующие отображению.
  • Улучшены возможности форматирования даты и геоданных.
  • Значения возвращаются в виде массива.

docvalue_fields

  • doc_values включены по умолчанию для большинства типов данных.
  • Не может использоваться для возврата текста или аннотированного_текста.
  • Загружает данные из кэша файловой системы.
  • Значения возвращаются в виде массива.
Понравилась статья? Поделиться с друзьями:
Добавить комментарий