访问文档中的字段
Elastic Stack Serverless
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 处理缺失值,并将不断发展以抽象访问 _source
和 doc_values
。
某些字段尚与 fields
API 兼容,例如 text
或 geo
字段。继续使用 doc
访问 field
API 不支持的字段类型。
field
API 返回一个 Field
对象,该对象迭代具有多个值的字段,从而通过 get(<default_value>)
方法访问底层值,以及类型转换和辅助方法。
无论字段是否存在或当前文档是否有任何值,field
API 都会返回您指定的默认值。 这意味着 field
API 可以处理缺失值,而无需额外的逻辑。 对于引用类型(例如 keyword
),默认值可以为 null
。 对于原始类型(例如 boolean
或 long
),默认值必须是匹配的原始类型,例如 false
或 1
。
您可以通过包含 $
快捷方式,而不必使用 get()
方法显式调用 field
API。 只需包含 $
符号、字段名称和默认值,以防该字段没有值
$(‘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(来自 get
和 as<Type>
方法)和 doc
映射(来自 getValue
和 get
方法)返回的值。
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 |