ドットエクスパンダープロセッサ

ドットを含むフィールドをオブジェクトフィールドに展開します。このプロセッサは、名前にドットを含むフィールドがパイプライン内の他のプロセッサによってアクセス可能になることを許可します。そうでなければ、これらのフィールドはどのプロセッサからもアクセスできません。


表 15. ドットエクスパンドオプション

名前 必須 デフォルト 説明
field はい - オブジェクトフィールドに展開するフィールド。*に設定すると、すべてのトップレベルフィールドが展開されます。
path いいえ - 展開するフィールドを含むフィールド。展開するフィールドが別のオブジェクトフィールドの一部である場合のみ必須です。fieldオプションはリーフフィールドのみを理解できます。
override いいえ 展開されたフィールドと競合する既存のネストされたオブジェクトがすでに存在する場合の動作を制御します。falseの場合、プロセッサは古い値と新しい値を配列に結合して競合をマージします。trueの場合、展開されたフィールドの値が既存の値を上書きします。
description いいえ - プロセッサの説明。プロセッサの目的や構成を説明するのに役立ちます。
if いいえ - プロセッサを条件付きで実行します。条件付きでプロセッサを実行するを参照してください。
ignore_failure いいえ false プロセッサの失敗を無視します。パイプラインの失敗を処理するを参照してください。
on_failure いいえ - プロセッサの失敗を処理します。パイプラインの失敗を処理するを参照してください。
tag いいえ - プロセッサの識別子。デバッグやメトリクスに役立ちます。

Js

  1. {
  2. "dot_expander": {
  3. "field": "foo.bar"
  4. }
  5. }

例えば、ドットエクスパンダープロセッサはこのドキュメントを変換します:

Js

  1. {
  2. "foo.bar" : "value"
  3. }

に変換されます:

Js

  1. {
  2. "foo" : {
  3. "bar" : "value"
  4. }
  5. }

もしbarフィールドがfooの下にネストされている場合、このプロセッサはfoo.barフィールドをそれにマージします。フィールドがスカラー値である場合、そのフィールドは配列フィールドに変換されます。

例えば、次のドキュメント:

Js

  1. {
  2. "foo.bar" : "value2",
  3. "foo" : {
  4. "bar" : "value1"
  5. }
  6. }

dot_expanderプロセッサによって次のように変換されます:

Js

  1. {
  2. "foo" : {
  3. "bar" : ["value1", "value2"]
  4. }
  5. }
  1. #### Js
  2. ``````js
  3. {
  4. "dot_expander": {
  5. "field": "foo.bar",
  6. "override": true
  7. }
  8. }
  9. `

その場合、展開されたフィールドの値はネストされたオブジェクトの値を上書きします。

Js

  1. {
  2. "foo" : {
  3. "bar" : "value2"
  4. }
  5. }
      • fieldの値は*に設定して、すべてのトップレベルのドット付きフィールド名を展開することもできます:

Js

  1. {
  2. "dot_expander": {
  3. "field": "*"
  4. }
  5. }

ドットエクスパンダープロセッサはこのドキュメントを変換します:

Js

  1. {
  2. "foo.bar" : "value",
  3. "baz.qux" : "value"
  4. }

に変換されます:

Js

  1. {
  2. "foo" : {
  3. "bar" : "value"
  4. },
  5. "baz" : {
  6. "qux" : "value"
  7. }
  8. }
      • ドットフィールドが非ドット構造内にネストされている場合、pathオプションを使用して非ドット構造をナビゲートします:

Js

  1. {
  2. "dot_expander": {
  3. "path": "foo"
  4. "field": "*"
  5. }
  6. }

ドットエクスパンダープロセッサはこのドキュメントを変換します:

Js

  1. {
  2. "foo" : {
  3. "bar.one" : "value",
  4. "bar.two" : "value"
  5. }
  6. }

に変換されます:

Js

  1. {
  2. "foo" : {
  3. "bar" : {
  4. "one" : "value",
  5. "two" : "value"
  6. }
  7. }
  8. }
      • リーフフィールド以外のフィールドが同じ名前の既存のフィールドと競合する場合、そのフィールドは最初に名前を変更する必要があります。

次のドキュメントを考えてみてください:

Js

  1. {
  2. "foo": "value1",
  3. "foo.bar": "value2"
  4. }

その後、foodot_expanderプロセッサが適用される前に最初に名前を変更する必要があります。foo.barフィールドがbarフィールドにfooフィールドの下で正しく展開されるためには、次のパイプラインを使用する必要があります:

Js

  1. {
  2. "processors" : [
  3. {
  4. "rename" : {
  5. "field" : "foo",
  6. "target_field" : "foo.bar"
  7. }
  8. },
  9. {
  10. "dot_expander": {
  11. "field": "foo.bar"
  12. }
  13. }
  14. ]
  15. }

その理由は、Ingestがスカラーフィールドをオブジェクトフィールドに自動的にキャストする方法を知らないからです。