Spec-Zone.ru › Elasticsearch 8
›Руководство по Elasticsearch [8.17] ›Скрипты

Доступ к полям документа с помощью API полей

API field всё ещё находится в разработке и следует рассматривать как бета-функцию. API может быть изменён, и эта итерация, вероятно, не является окончательной. Для получения информации о статусе функции обратитесь к #78920.

Используйте API field для доступа к полям документов:

field('my_field').get(<default_value>)

Данный API фундаментально изменяет способ доступа к документам в Painless. Раньше вам нужно было получить доступ к отображению doc с именем поля, которое вы хотели получить:

doc['my_field'].value

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

Вместо этого используйте API field, который является предпочтительным подходом к доступу к документам в Painless. API field обрабатывает отсутствующие значения и будет развиваться, чтобы абстрагировать доступ к _source и doc_values.

Некоторые поля пока несовместимы с API fields, такие как поля text или geo. Продолжайте использовать doc для доступа к типам полей, которые API field не поддерживает.

API field возвращает объект Field, который итерируется по полям с несколькими значениями, предоставляя доступ к базовому значению через метод get(<default_value>), а также методы преобразования типов и вспомогательные методы.

API field возвращает заданное значение по умолчанию, независимо от того, существует ли поле или имеются ли для текущего документа значения этого поля. Это означает, что API field может обрабатывать отсутствующие значения без необходимости дополнительной логики. Для типа ссылки, такого как keyword, значение по умолчанию может быть null. Для примитивного типа, такого как boolean или long, значение по умолчанию должно быть соответствующего примитивного типа, например, false или 1.

Удобный и упрощённый доступ

Вместо явного вызова API field с методом get(), вы можете использовать сокращение $. Просто укажите символ $, имя поля и значение по умолчанию, на случай, если поле не имеет значения:

$(‘field’, <default_value>)

Благодаря этим расширенным возможностям и упрощённому синтаксису вы можете писать более короткие, менее сложные и более читаемые скрипты. Например, следующий скрипт использует устаревший синтаксис для определения разницы в миллисекундах между двумя сложными значениями datetime из индексированного документа:

if (doc.containsKey('start') && doc.containsKey('end')) {
   if (doc['start'].size() > 0 && doc['end'].size() > 0) {
       ZonedDateTime start = doc['start'].value;
       ZonedDateTime end = doc['end'].value;
       return ChronoUnit.MILLIS.between(start, end);
   } else {
       return -1;
   }
} else {
   return -1;
}

Используя API field, вы можете написать этот же скрипт намного более лаконично, без необходимости дополнительной логики для определения существования полей перед их использованием:

ZonedDateTime start = field('start').get(null);
ZonedDateTime end = field('end').get(null);
return start == null || end == null ? -1 : ChronoUnit.MILLIS.between(start, end)

Поддерживаемые типы отображаемых полей

В следующей таблице указаны типы отображаемых полей, поддерживаемые API field. Для каждого поддерживаемого типа перечислены значения, возвращаемые API field (из методов get и as<Type>) и отображением doc (из методов getValue и get).

API fields в настоящее время не поддерживает некоторые поля, но вы всё ещё можете получить доступ к этим полям через отображения doc. Для получения самого актуального списка поддерживаемых полей обратитесь к #79105.

Тип сопоставленного поля Возвращаемый тип от field Возвращаемый тип от doc

get

as<Type>

getValue

get

binary

ByteBuffer

-

BytesRef

BytesRef

boolean

boolean

-

boolean

Boolean

keyword

String

-

String

String

long

long

-

long

Long

integer

int

-

long

Long

short

short

-

long

Long

byte

byte

-

long

Long

double

double

-

double

Double

scaled_float

double

-

double

Double

half_float

float

-

double

Double

unsigned_long

long

BigInteger

long

Long

date

ZonedDateTime

-

ZonedDateTime

ZonedDateTime

date_nanos

ZonedDateTime

-

ZonedDateTime

ZonedDateTime

ip

IpAddress

String

String

String

_version

long

-

long

Long

_seq_no

long

-

long

Long

version

Version

String

String

String

murmur3

long

-

long

Long

constant_keyword

String

-

String

String

wildcard

String

-

String

String

flattened

String

-

String

String

© 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/script-fields-api.html

Spec-Zone.ru

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