Spec-Zone.ru › Elasticsearch 7
›Elasticsearch Guide [7.17] ›Скриптинг

Язык выражений Lucene

Выражения Lucene компилируют выражение javascript в байткод. Они предназначены для высокопроизводительных пользовательских функций ранжирования и сортировки и включены по умолчанию для скриптов inline и stored.

Производительность

Выражения были разработаны для достижения конкурентоспособной производительности с пользовательским кодом Lucene. Эта производительность обусловлена низкой накладными расходами на документ по сравнению с другими движками скриптов: выражения выполняют больше предварительных операций.

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

Синтаксис

Выражения поддерживают подмножество синтаксиса JavaScript: одно выражение.

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

Переменные в скриптах expression доступны для доступа к:

  • полям документов, например, doc['myfield'].value
  • переменным и методам, которые поддерживает поле, например, doc['myfield'].empty
  • параметрам, переданным в скрипт, например, mymodifier
  • текущему значению оценки документа, _score (доступно только при использовании в script_score)

Вы можете использовать скрипты выражений для script_score, script_fields, скриптов сортировки и числовых скриптов агрегации, просто установите параметр lang в значение expression.

API числовых полей

Выражение Описание

doc['field_name'].value

Значение поля в качестве double

doc['field_name'].empty

Логическое значение, указывающее, нет ли значений поля в документе.

doc['field_name'].length

Количество значений в этом документе.

doc['field_name'].min()

Минимальное значение поля в этом документе.

doc['field_name'].max()

Максимальное значение поля в этом документе.

doc['field_name'].median()

Медианное значение поля в этом документе.

doc['field_name'].avg()

Среднее значение значений в этом документе.

doc['field_name'].sum()

Сумма значений в этом документе.

Если поле отсутствует в документе, по умолчанию оно обрабатывается как 0. Вы можете задать другое значение, например, doc['myfield'].empty ? 100 : doc['myfield'].value

Если у документа несколько значений для поля, по умолчанию возвращается минимальное значение. Вы можете выбрать другое значение, например, doc['myfield'].sum().

Если поле отсутствует в документе, по умолчанию оно обрабатывается как 0.

Булевы поля представлены как числовые, где true отображается как 1, а false отображается как 0. Например: doc['on_sale'].value ? doc['price'].value * 0.5 : doc['price'].value

API полей даты

Поля дат обрабатываются как количество миллисекунд с момента 1 января 1970 года и поддерживают API числовых полей выше, плюс доступ к некоторым полям, специфичным для дат:

Выражение Описание

doc['field_name'].date.centuryOfEra

Века (1-2920000)

doc['field_name'].date.dayOfMonth

День (1-31), например, 1 для первого числа месяца.

doc['field_name'].date.dayOfWeek

День недели (1-7), например, 1 для понедельника.

doc['field_name'].date.dayOfYear

День года, например, 1 для 1 января.

doc['field_name'].date.era

Эра: 0 для до нашей эры, 1 для нашей эры.

doc['field_name'].date.hourOfDay

Час (0-23).

doc['field_name'].date.millisOfDay

Миллисекунды в течение дня (0-86399999).

doc['field_name'].date.millisOfSecond

Миллисекунды в течение секунды (0-999).

doc['field_name'].date.minuteOfDay

Минуты в течение дня (0-1439).

doc['field_name'].date.minuteOfHour

Минуты в течение часа (0-59).

doc['field_name'].date.monthOfYear

Месяц в году (1-12), например, 1 для января.

doc['field_name'].date.secondOfDay

Секунды в течение дня (0-86399).

doc['field_name'].date.secondOfMinute

Секунды в течение минуты (0-59).

doc['field_name'].date.year

Год (-292000000 - 292000000).

doc['field_name'].date.yearOfCentury

Год в рамках века (1-100).

doc['field_name'].date.yearOfEra

Год в рамках эры (1-292000000).

Следующий пример показывает разницу в годах между полями дат date0 и date1:

doc['date1'].date.year - doc['date0'].date.year

geo_point API поля

Выражение Описание

doc['field_name'].empty

Логическое значение, указывающее, нет ли значений поля в документе.

doc['field_name'].lat

Широта гео-точки.

doc['field_name'].lon

Долгота гео-точки.

Следующий пример вычисляет расстояние в километрах от Вашингтона, округ Колумбия:

haversin(38.9072, 77.0369, doc['field_name'].lat, doc['field_name'].lon)

В этом примере координаты могли быть переданы в скрипт в качестве параметров, например, на основе геолокации пользователя.

Ограничения

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

  • Доступны только числовые, boolean, date и geo_point поля
  • Не доступны сохраненные поля

© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/modules-scripting-expression.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API