フィールドAPIを使用してドキュメント内のフィールドにアクセスする
field
APIはまだ開発中であり、ベータ機能と見なされるべきです。このAPIは変更される可能性があり、このバージョンは最終的な状態ではない可能性があります。機能のステータスについては、#78920を参照してください。
field
APIを使用してドキュメントフィールドにアクセスします:
ペインレス
field('my_field').get(<default_value>)
このAPIは、Painlessでドキュメントにアクセスする方法を根本的に変更します。以前は、アクセスしたいフィールド名を使用してdoc
マップにアクセスする必要がありました:
ペインレス
doc['my_field'].value
この方法でドキュメントフィールドにアクセスすると、欠損値や欠損マッピングを処理できなかったため、堅牢なPainlessスクリプトを書くには、フィールドと値の両方が存在することを確認するロジックを含める必要がありました。
代わりに、Painlessでドキュメントにアクセスするための推奨アプローチであるfield
APIを使用します。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
のような一致するプリミティブ型でなければなりません。
便利でシンプルなアクセス
明示的にfield
APIをget()
メソッドで呼び出す代わりに、$
ショートカットを含めることができます。フィールドに値がない場合に備えて、$
シンボル、フィールド名、およびデフォルト値を含めるだけです:
ペインレス
$(‘field’, <default_value>)
これらの強化された機能と簡素化された構文を使用すると、短く、複雑さが少なく、読みやすいスクリプトを書くことができます。たとえば、次のスクリプトは、インデックスされたドキュメントからの2つの複雑な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 |