Spec-Zone.ru › Elasticsearch 8
›Elasticsearch Guide [8.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

API поля geo_point

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

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/8.17/modules-scripting-expression.html

Spec-Zone.ru

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