使用字段 API 访问文档中的字段

编辑

使用 field API 访问文档中的字段

编辑

field API 仍在开发中,应被视为 Beta 功能。该 API 可能会发生更改,当前迭代可能不是最终状态。有关功能状态,请参阅 #78920

使用 field API 访问文档字段

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

此 API 从根本上改变了在 Painless 中访问文档的方式。以前,您必须使用要访问的字段名称访问 doc 映射。

doc['my_field'].value

以这种方式访问文档字段无法处理缺失值或缺失的映射,这意味着要编写健壮的 Painless 脚本,您需要包含逻辑来检查字段和值是否存在。

相反,请使用 field API,这是在 Painless 中访问文档的首选方法。field API 处理缺失值,并将逐步抽象对 _sourcedoc_values 的访问。

某些字段尚不兼容 fields API,例如 textgeo 字段。继续使用 doc 来访问 field API 不支持的字段类型。

field API 返回一个 Field 对象,该对象迭代具有多个值的字段,并通过 get(<default_value>) 方法以及类型转换和辅助方法提供对底层值的访问。

field API 返回您指定的默认值,无论该字段是否存在或当前文档是否有任何值。这意味着 field API 可以处理缺失值,而无需额外的逻辑。对于诸如 keyword 之类的引用类型,默认值可以是 null。对于诸如 booleanlong 之类的原始类型,默认值必须是匹配的原始类型,例如 false1

便捷、更简单的访问

编辑

您可以使用 $ 快捷方式,而不是显式调用 field API 的 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;
}

使用 field API,您可以更简洁地编写相同的脚本,而无需额外的逻辑来确定字段是否存在然后再对其进行操作。

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

支持的映射字段类型

编辑

下表显示了 field API 支持的映射字段类型。对于每个支持的类型,列出了 field API(来自 getas<Type> 方法)和 doc 映射(来自 getValueget 方法)返回的值。

fields API 当前不支持某些字段,但您仍然可以通过 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