Как использовать Runtime Fields в OpenSearch

Runtime Fields - это поле, оцениваемое во время запроса, а не во время индексирования, что позволяет модифицировать схему на этапе запроса.

Они позволяют:

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

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

Поля доступны из поискового API теми же способами, что и другие поля, и OpenSearch работает с ними точно так же. Они могут быть определены как во время индекса, так и во время запроса.

Runtime Fields - это поле в индексе, значение которого извлекается из другого индекса. Поле поиска дает возможность создать связь между документами в разных индексах.

Для чего используются Runtime Fields выполнения поиска

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

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

Как реализовать поля выполнения с типом lookup

Runtime Fields выполнения с типом lookup могут получать значения полей из связанных с ними индексов с помощью параметра fields в API _search.

Сначала необходимо определить в основном поисковом запросе поле выполнения с типом lookup и указать следующие параметры:

  • type: должно быть "lookup".
  • target_index: представляет собой индекс, из которого мы хотим получить значения полей и по которому выполняется запрос lookup.
  • input_field: представляет поле в первичном индексе, значения которого используются в качестве входных значений запроса lookup term.
  • target_field: представляет поле, по которому выполняется поиск в целевом индексе lookup.
  • fetch_fields: представляет поля, которые должны быть получены из целевого индекса lookup.

Пример

В приведенном ниже примере мы иллюстрируем функциональность lookup для объединения двух индексов, когда целевой индекс содержит данные, которые часто меняются (хотя в данном примере, конечно, маловероятно, чтобы авторы часто меняли свои имена).

У нас есть два индекса, один для авторов, состоящий из трех полей: фамилии, имени и отчества автора и идентификатора книги. Второй индекс предназначен для книг и состоит из двух полей: идентификатора книги и названия книги.

Мы хотим получить из индекса authors значение author_name, связанное с идентификатором книги, состоящим из полей first_name и last_name. В результате мы получим идентификатор и название книги в дополнение к полному имени автора этой книги.

В примере мы определили в основном поисковом запросе поле author_name с типом lookup, который извлекает поля (first_name и last_name) из целевого индекса (authors) с помощью терминологических запросов.

Целевым индексом, в котором выполняется запрос lookup, является индекс авторов, содержащий поля, которые необходимо извлечь. Входное поле - ID - представляет собой поле основного индекса, значения которого используются в качестве входных значений терминологического запроса lookup. Целевое поле - book_id - представляет собой поле в индексе поиска, по которому выполняется поиск в запросе lookup. Поля fetch - first_name и last_name - представляют собой поля, которые необходимо извлечь из поискового индекса.

В результате поиска были получены следующие результаты:

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

Примечания и полезные сведения

  • Возможность добавления полей в документы после их ввода является основным преимуществом.
  • Runtime Fields экономят дисковое пространство и обеспечивают большую гибкость при доступе к данным, но в зависимости от вычислений, выполняемых в сценарии, они могут оказывать негативное влияние на производительность поиска.
  • Если целевой индекс не претерпевает значительных изменений, то лучшим решением будет использование процессора обогащения, а не Runtime Fields для обогащения.
  • Размер индекса не увеличивается при Runtime Fields, поскольку поля не индексируются. Снизить затраты на хранение и ускорить ввод данных можно, напрямую определивRuntime Fields в маппинге индекса.
  • При выполнении зависимого запроса обновление или удаление Runtime Fields может привести к получению противоречивых результатов. В зависимости от времени обновления маппинга каждый шард может иметь доступ к разным копиям сценария.
  • Если Runtime Fields удалено или обновлено, это может нарушить существующий поиск или визуализацию в Kibana.
Понравилась статья? Поделиться с друзьями:
Добавить комментарий