正在加载

访问文档中的字段

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 处理缺失值,并将不断发展以抽象访问 _sourcedoc_values

注意

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

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

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

您可以通过包含 $ 快捷方式,而不必使用 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(来自 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
© . All rights reserved.