フィールドAPIを使用してドキュメント内のフィールドにアクセスする

field APIはまだ開発中であり、ベータ機能と見なされるべきです。このAPIは変更される可能性があり、このバージョンは最終的な状態ではない可能性があります。機能のステータスについては、#78920を参照してください。

field APIを使用してドキュメントフィールドにアクセスします:

ペインレス

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

このAPIは、Painlessでドキュメントにアクセスする方法を根本的に変更します。以前は、アクセスしたいフィールド名を使用してdocマップにアクセスする必要がありました:

ペインレス

  1. doc['my_field'].value

この方法でドキュメントフィールドにアクセスすると、欠損値や欠損マッピングを処理できなかったため、堅牢なPainlessスクリプトを書くには、フィールドと値の両方が存在することを確認するロジックを含める必要がありました。

代わりに、Painlessでドキュメントにアクセスするための推奨アプローチであるfield APIを使用します。field APIは欠損値を処理し、_sourceおよびdoc_valuesへのアクセスを抽象化するように進化します。

一部のフィールドはまだfields APIと互換性がなく、textgeoフィールドなどがあります。docを使用して、field APIがサポートしていないフィールドタイプにアクセスし続けてください。

field APIは、複数の値を持つフィールドを反復処理するFieldオブジェクトを返し、get(<default_value>)メソッドを介して基礎となる値にアクセスできるほか、型変換やヘルパーメソッドも提供します。

field APIは、フィールドが存在するかどうか、または現在のドキュメントに値があるかどうかに関係なく、指定したデフォルト値を返します。これは、field APIが追加のロジックを必要とせずに欠損値を処理できることを意味します。keywordのような参照型の場合、デフォルト値はnullである可能性があります。booleanlongのようなプリミティブ型の場合、デフォルト値はfalse1のような一致するプリミティブ型でなければなりません。

便利でシンプルなアクセス

明示的にfield APIをget()メソッドで呼び出す代わりに、$ショートカットを含めることができます。フィールドに値がない場合に備えて、$シンボル、フィールド名、およびデフォルト値を含めるだけです:

ペインレス

  1. $(‘field’, <default_value>)

これらの強化された機能と簡素化された構文を使用すると、短く、複雑さが少なく、読みやすいスクリプトを書くことができます。たとえば、次のスクリプトは、インデックスされたドキュメントからの2つの複雑なdatetime値の間のミリ秒の違いを決定するために、古い構文を使用しています:

ペインレス

  1. if (doc.containsKey('start') && doc.containsKey('end')) {
  2. if (doc['start'].size() > 0 && doc['end'].size() > 0) {
  3. ZonedDateTime start = doc['start'].value;
  4. ZonedDateTime end = doc['end'].value;
  5. return ChronoUnit.MILLIS.between(start, end);
  6. } else {
  7. return -1;
  8. }
  9. } else {
  10. return -1;
  11. }

field APIを使用すると、フィールドが存在するかどうかを判断するための追加のロジックを必要とせずに、この同じスクリプトをはるかに簡潔に書くことができます:

ペインレス

  1. ZonedDateTime start = field('start').get(null);
  2. ZonedDateTime end = field('end').get(null);
  3. 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