添付プロセッサ

添付プロセッサは、Apacheテキスト抽出ライブラリTikaを使用して、Elasticsearchが一般的な形式(PPT、XLS、PDFなど)のファイル添付を抽出できるようにします。

ソースフィールドはbase64エンコードされたバイナリである必要があります。 base64間の変換のオーバーヘッドを避けたい場合は、JSONの代わりにCBOR形式を使用し、フィールドを文字列表現ではなくバイト配列として指定できます。プロセッサはその場合、base64デコードをスキップします。

パイプラインでの添付プロセッサの使用


表4. 添付オプション

名前 必須 デフォルト 説明
field はい - base64エンコードされたフィールドを取得するフィールド
target_field いいえ attachment 添付情報を保持するフィールド
indexed_chars いいえ 100000 巨大なフィールドを防ぐために抽出に使用される文字数。制限なしの場合は-1を使用します。
indexed_chars_field いいえ null 抽出に使用される文字数を上書きできるフィールド名。indexed_charsを参照してください。
properties いいえ すべてのプロパティ 保存するプロパティの配列。contenttitlenameauthorkeywordsdatecontent_typecontent_lengthlanguageが含まれます。
ignore_missing いいえ false trueおよびfieldが存在しない場合、プロセッサはドキュメントを変更せずに静かに終了します。
remove_binary いいえ false trueの場合、バイナリfieldはドキュメントから削除されます。
resource_name いいえ デコードするリソースの名前を含むフィールド。指定された場合、プロセッサはこのリソース名を基盤となるTikaライブラリに渡してリソース名ベースの検出を有効にします。

JSONドキュメントにファイルを添付する場合、最初にファイルをbase64文字列としてエンコードする必要があります。Unix系システムでは、base64コマンドを使用してこれを行うことができます:

シェル

  1. base64 -in myfile.rtf

コマンドはファイルのbase64エンコードされた文字列を返します。次のbase64文字列は、テキストLorem ipsum dolor sit ametを含む.rtfファイルのものです: e1xydGYxXGFuc2kNCkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0DQpccGFyIH0=

添付プロセッサを使用して文字列をデコードし、ファイルのプロパティを抽出します:

Python

  1. resp = client.ingest.put_pipeline(
  2. id="attachment",
  3. description="Extract attachment information",
  4. processors=[
  5. {
  6. "attachment": {
  7. "field": "data",
  8. "remove_binary": False
  9. }
  10. }
  11. ],
  12. )
  13. print(resp)
  14. resp1 = client.index(
  15. index="my-index-000001",
  16. id="my_id",
  17. pipeline="attachment",
  18. document={
  19. "data": "e1xydGYxXGFuc2kNCkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0DQpccGFyIH0="
  20. },
  21. )
  22. print(resp1)
  23. resp2 = client.get(
  24. index="my-index-000001",
  25. id="my_id",
  26. )
  27. print(resp2)

Ruby

  1. response = client.ingest.put_pipeline(
  2. id: 'attachment',
  3. body: {
  4. description: 'Extract attachment information',
  5. processors: [
  6. {
  7. attachment: {
  8. field: 'data',
  9. remove_binary: false
  10. }
  11. }
  12. ]
  13. }
  14. )
  15. puts response
  16. response = client.index(
  17. index: 'my-index-000001',
  18. id: 'my_id',
  19. pipeline: 'attachment',
  20. body: {
  21. data: 'e1xydGYxXGFuc2kNCkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0DQpccGFyIH0='
  22. }
  23. )
  24. puts response
  25. response = client.get(
  26. index: 'my-index-000001',
  27. id: 'my_id'
  28. )
  29. puts response

Js

  1. const response = await client.ingest.putPipeline({
  2. id: "attachment",
  3. description: "Extract attachment information",
  4. processors: [
  5. {
  6. attachment: {
  7. field: "data",
  8. remove_binary: false,
  9. },
  10. },
  11. ],
  12. });
  13. console.log(response);
  14. const response1 = await client.index({
  15. index: "my-index-000001",
  16. id: "my_id",
  17. pipeline: "attachment",
  18. document: {
  19. data: "e1xydGYxXGFuc2kNCkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0DQpccGFyIH0=",
  20. },
  21. });
  22. console.log(response1);
  23. const response2 = await client.get({
  24. index: "my-index-000001",
  25. id: "my_id",
  26. });
  27. console.log(response2);

コンソール

  1. PUT _ingest/pipeline/attachment
  2. {
  3. "description" : "Extract attachment information",
  4. "processors" : [
  5. {
  6. "attachment" : {
  7. "field" : "data",
  8. "remove_binary": false
  9. }
  10. }
  11. ]
  12. }
  13. PUT my-index-000001/_doc/my_id?pipeline=attachment
  14. {
  15. "data": "e1xydGYxXGFuc2kNCkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0DQpccGFyIH0="
  16. }
  17. GET my-index-000001/_doc/my_id

ドキュメントのattachmentオブジェクトには、ファイルの抽出されたプロパティが含まれています:

コンソール-結果

  1. {
  2. "found": true,
  3. "_index": "my-index-000001",
  4. "_id": "my_id",
  5. "_version": 1,
  6. "_seq_no": 22,
  7. "_primary_term": 1,
  8. "_source": {
  9. "data": "e1xydGYxXGFuc2kNCkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0DQpccGFyIH0=",
  10. "attachment": {
  11. "content_type": "application/rtf",
  12. "language": "ro",
  13. "content": "Lorem ipsum dolor sit amet",
  14. "content_length": 28
  15. }
  16. }
  17. }

ドキュメント内にバイナリをフィールドとして保持することは、多くのリソースを消費する可能性があります。このフィールドをドキュメントから削除することを強くお勧めします。remove_binarytrueに設定して、フィールドを自動的に削除します。

エクスポートされたフィールド

ドキュメントから抽出される可能性のあるフィールドは次のとおりです:

  • content,
  • title,
  • author,
  • keywords,
  • date,
  • content_type,
  • content_length,
  • language,
  • modified,
  • format,
  • identifier,
  • contributor,
  • coverage,
  • modifier,
  • creator_tool,
  • publisher,
  • relation,
  • rights,
  • source,
  • type,
  • description,
  • print_date,
  • metadata_date,
  • latitude,
  • longitude,
  • altitude,
  • rating,
  • comments

特定のattachmentフィールドのみを抽出するには、properties配列を指定します:

Python

  1. resp = client.ingest.put_pipeline(
  2. id="attachment",
  3. description="Extract attachment information",
  4. processors=[
  5. {
  6. "attachment": {
  7. "field": "data",
  8. "properties": [
  9. "content",
  10. "title"
  11. ],
  12. "remove_binary": False
  13. }
  14. }
  15. ],
  16. )
  17. print(resp)

Ruby

  1. response = client.ingest.put_pipeline(
  2. id: 'attachment',
  3. body: {
  4. description: 'Extract attachment information',
  5. processors: [
  6. {
  7. attachment: {
  8. field: 'data',
  9. properties: [
  10. 'content',
  11. 'title'
  12. ],
  13. remove_binary: false
  14. }
  15. }
  16. ]
  17. }
  18. )
  19. puts response

Js

  1. const response = await client.ingest.putPipeline({
  2. id: "attachment",
  3. description: "Extract attachment information",
  4. processors: [
  5. {
  6. attachment: {
  7. field: "data",
  8. properties: ["content", "title"],
  9. remove_binary: false,
  10. },
  11. },
  12. ],
  13. });
  14. console.log(response);

コンソール

  1. PUT _ingest/pipeline/attachment
  2. {
  3. "description" : "Extract attachment information",
  4. "processors" : [
  5. {
  6. "attachment" : {
  7. "field" : "data",
  8. "properties": [ "content", "title" ],
  9. "remove_binary": false
  10. }
  11. }
  12. ]
  13. }

バイナリデータからコンテンツを抽出することはリソース集約的な操作であり、多くのリソースを消費します。このプロセッサを使用してパイプラインを実行するには、専用のインジェストノードを使用することを強くお勧めします。

CBORで添付プロセッサを使用する

JSONをbase64にエンコードおよびデコードするのを避けるために、代わりにCBORデータを添付プロセッサに渡すことができます。たとえば、次のリクエストは、添付プロセッサを使用するcbor-attachmentパイプラインを作成します。

Python

  1. resp = client.ingest.put_pipeline(
  2. id="cbor-attachment",
  3. description="Extract attachment information",
  4. processors=[
  5. {
  6. "attachment": {
  7. "field": "data",
  8. "remove_binary": False
  9. }
  10. }
  11. ],
  12. )
  13. print(resp)

Ruby

  1. response = client.ingest.put_pipeline(
  2. id: 'cbor-attachment',
  3. body: {
  4. description: 'Extract attachment information',
  5. processors: [
  6. {
  7. attachment: {
  8. field: 'data',
  9. remove_binary: false
  10. }
  11. }
  12. ]
  13. }
  14. )
  15. puts response

Js

  1. const response = await client.ingest.putPipeline({
  2. id: "cbor-attachment",
  3. description: "Extract attachment information",
  4. processors: [
  5. {
  6. attachment: {
  7. field: "data",
  8. remove_binary: false,
  9. },
  10. },
  11. ],
  12. });
  13. console.log(response);

コンソール

  1. PUT _ingest/pipeline/cbor-attachment
  2. {
  3. "description" : "Extract attachment information",
  4. "processors" : [
  5. {
  6. "attachment" : {
  7. "field" : "data",
  8. "remove_binary": false
  9. }
  10. }
  11. ]
  12. }

次のPythonスクリプトは、cbor-attachmentパイプラインを含むHTTPインデックスリクエストにCBORデータを渡します。HTTPリクエストヘッダーは、content-typeapplication/cborを使用します。

すべてのElasticsearchクライアントがカスタムHTTPリクエストヘッダーをサポートしているわけではありません。

Python

  1. import cbor2
  2. import requests
  3. file = 'my-file'
  4. headers = {'content-type': 'application/cbor'}
  5. with open(file, 'rb') as f:
  6. doc = {
  7. 'data': f.read()
  8. }
  9. requests.put(
  10. 'http://localhost:9200/my-index-000001/_doc/my_id?pipeline=cbor-attachment',
  11. data=cbor2.dumps(doc),
  12. headers=headers
  13. )

抽出される文字数の制限

あまりにも多くの文字を抽出してノードメモリをオーバーロードしないように、抽出に使用される文字数はデフォルトで100000に制限されています。この値はindexed_charsを設定することで変更できます。制限なしの場合は-1を使用しますが、これを設定する際には、ノードが非常に大きなドキュメントの内容を抽出するのに十分なHEAPを持っていることを確認してください。

特定のフィールドから抽出して設定する制限を定義することもできます。ドキュメントにそのフィールドがある場合、indexed_chars設定が上書きされます。このフィールドを設定するには、indexed_chars_field設定を定義します。

たとえば:

Python

  1. resp = client.ingest.put_pipeline(
  2. id="attachment",
  3. description="Extract attachment information",
  4. processors=[
  5. {
  6. "attachment": {
  7. "field": "data",
  8. "indexed_chars": 11,
  9. "indexed_chars_field": "max_size",
  10. "remove_binary": False
  11. }
  12. }
  13. ],
  14. )
  15. print(resp)
  16. resp1 = client.index(
  17. index="my-index-000001",
  18. id="my_id",
  19. pipeline="attachment",
  20. document={
  21. "data": "e1xydGYxXGFuc2kNCkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0DQpccGFyIH0="
  22. },
  23. )
  24. print(resp1)
  25. resp2 = client.get(
  26. index="my-index-000001",
  27. id="my_id",
  28. )
  29. print(resp2)

Ruby

  1. response = client.ingest.put_pipeline(
  2. id: 'attachment',
  3. body: {
  4. description: 'Extract attachment information',
  5. processors: [
  6. {
  7. attachment: {
  8. field: 'data',
  9. indexed_chars: 11,
  10. indexed_chars_field: 'max_size',
  11. remove_binary: false
  12. }
  13. }
  14. ]
  15. }
  16. )
  17. puts response
  18. response = client.index(
  19. index: 'my-index-000001',
  20. id: 'my_id',
  21. pipeline: 'attachment',
  22. body: {
  23. data: 'e1xydGYxXGFuc2kNCkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0DQpccGFyIH0='
  24. }
  25. )
  26. puts response
  27. response = client.get(
  28. index: 'my-index-000001',
  29. id: 'my_id'
  30. )
  31. puts response

Js

  1. const response = await client.ingest.putPipeline({
  2. id: "attachment",
  3. description: "Extract attachment information",
  4. processors: [
  5. {
  6. attachment: {
  7. field: "data",
  8. indexed_chars: 11,
  9. indexed_chars_field: "max_size",
  10. remove_binary: false,
  11. },
  12. },
  13. ],
  14. });
  15. console.log(response);
  16. const response1 = await client.index({
  17. index: "my-index-000001",
  18. id: "my_id",
  19. pipeline: "attachment",
  20. document: {
  21. data: "e1xydGYxXGFuc2kNCkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0DQpccGFyIH0=",
  22. },
  23. });
  24. console.log(response1);
  25. const response2 = await client.get({
  26. index: "my-index-000001",
  27. id: "my_id",
  28. });
  29. console.log(response2);

コンソール

  1. PUT _ingest/pipeline/attachment
  2. {
  3. "description" : "Extract attachment information",
  4. "processors" : [
  5. {
  6. "attachment" : {
  7. "field" : "data",
  8. "indexed_chars" : 11,
  9. "indexed_chars_field" : "max_size",
  10. "remove_binary": false
  11. }
  12. }
  13. ]
  14. }
  15. PUT my-index-000001/_doc/my_id?pipeline=attachment
  16. {
  17. "data": "e1xydGYxXGFuc2kNCkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0DQpccGFyIH0="
  18. }
  19. GET my-index-000001/_doc/my_id

これを返します:

コンソール-結果

  1. {
  2. "found": true,
  3. "_index": "my-index-000001",
  4. "_id": "my_id",
  5. "_version": 1,
  6. "_seq_no": 35,
  7. "_primary_term": 1,
  8. "_source": {
  9. "data": "e1xydGYxXGFuc2kNCkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0DQpccGFyIH0=",
  10. "attachment": {
  11. "content_type": "application/rtf",
  12. "language": "is",
  13. "content": "Lorem ipsum",
  14. "content_length": 11
  15. }
  16. }
  17. }

Python

  1. resp = client.ingest.put_pipeline(
  2. id="attachment",
  3. description="Extract attachment information",
  4. processors=[
  5. {
  6. "attachment": {
  7. "field": "data",
  8. "indexed_chars": 11,
  9. "indexed_chars_field": "max_size",
  10. "remove_binary": False
  11. }
  12. }
  13. ],
  14. )
  15. print(resp)
  16. resp1 = client.index(
  17. index="my-index-000001",
  18. id="my_id_2",
  19. pipeline="attachment",
  20. document={
  21. "data": "e1xydGYxXGFuc2kNCkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0DQpccGFyIH0=",
  22. "max_size": 5
  23. },
  24. )
  25. print(resp1)
  26. resp2 = client.get(
  27. index="my-index-000001",
  28. id="my_id_2",
  29. )
  30. print(resp2)

Ruby

  1. response = client.ingest.put_pipeline(
  2. id: 'attachment',
  3. body: {
  4. description: 'Extract attachment information',
  5. processors: [
  6. {
  7. attachment: {
  8. field: 'data',
  9. indexed_chars: 11,
  10. indexed_chars_field: 'max_size',
  11. remove_binary: false
  12. }
  13. }
  14. ]
  15. }
  16. )
  17. puts response
  18. response = client.index(
  19. index: 'my-index-000001',
  20. id: 'my_id_2',
  21. pipeline: 'attachment',
  22. body: {
  23. data: 'e1xydGYxXGFuc2kNCkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0DQpccGFyIH0=',
  24. max_size: 5
  25. }
  26. )
  27. puts response
  28. response = client.get(
  29. index: 'my-index-000001',
  30. id: 'my_id_2'
  31. )
  32. puts response

Js

  1. const response = await client.ingest.putPipeline({
  2. id: "attachment",
  3. description: "Extract attachment information",
  4. processors: [
  5. {
  6. attachment: {
  7. field: "data",
  8. indexed_chars: 11,
  9. indexed_chars_field: "max_size",
  10. remove_binary: false,
  11. },
  12. },
  13. ],
  14. });
  15. console.log(response);
  16. const response1 = await client.index({
  17. index: "my-index-000001",
  18. id: "my_id_2",
  19. pipeline: "attachment",
  20. document: {
  21. data: "e1xydGYxXGFuc2kNCkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0DQpccGFyIH0=",
  22. max_size: 5,
  23. },
  24. });
  25. console.log(response1);
  26. const response2 = await client.get({
  27. index: "my-index-000001",
  28. id: "my_id_2",
  29. });
  30. console.log(response2);

コンソール

  1. PUT _ingest/pipeline/attachment
  2. {
  3. "description" : "Extract attachment information",
  4. "processors" : [
  5. {
  6. "attachment" : {
  7. "field" : "data",
  8. "indexed_chars" : 11,
  9. "indexed_chars_field" : "max_size",
  10. "remove_binary": false
  11. }
  12. }
  13. ]
  14. }
  15. PUT my-index-000001/_doc/my_id_2?pipeline=attachment
  16. {
  17. "data": "e1xydGYxXGFuc2kNCkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0DQpccGFyIH0=",
  18. "max_size": 5
  19. }
  20. GET my-index-000001/_doc/my_id_2

これを返します:

コンソール-結果

  1. {
  2. "found": true,
  3. "_index": "my-index-000001",
  4. "_id": "my_id_2",
  5. "_version": 1,
  6. "_seq_no": 40,
  7. "_primary_term": 1,
  8. "_source": {
  9. "data": "e1xydGYxXGFuc2kNCkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0DQpccGFyIH0=",
  10. "max_size": 5,
  11. "attachment": {
  12. "content_type": "application/rtf",
  13. "language": "sl",
  14. "content": "Lorem",
  15. "content_length": 5
  16. }
  17. }
  18. }

配列での添付プロセッサの使用

添付プロセッサを添付の配列内で使用するには、foreachプロセッサが必要です。これにより、添付プロセッサが配列の各要素で実行されるようになります。

たとえば、次のソースがあるとします:

Js

  1. {
  2. "attachments" : [
  3. {
  4. "filename" : "ipsum.txt",
  5. "data" : "dGhpcyBpcwpqdXN0IHNvbWUgdGV4dAo="
  6. },
  7. {
  8. "filename" : "test.txt",
  9. "data" : "VGhpcyBpcyBhIHRlc3QK"
  10. }
  11. ]
  12. }

この場合、添付フィールドの各要素のデータフィールドを処理し、プロパティをドキュメントに挿入したいので、次のforeachプロセッサが使用されます:

Python

  1. resp = client.ingest.put_pipeline(
  2. id="attachment",
  3. description="Extract attachment information from arrays",
  4. processors=[
  5. {
  6. "foreach": {
  7. "field": "attachments",
  8. "processor": {
  9. "attachment": {
  10. "target_field": "_ingest._value.attachment",
  11. "field": "_ingest._value.data",
  12. "remove_binary": False
  13. }
  14. }
  15. }
  16. }
  17. ],
  18. )
  19. print(resp)
  20. resp1 = client.index(
  21. index="my-index-000001",
  22. id="my_id",
  23. pipeline="attachment",
  24. document={
  25. "attachments": [
  26. {
  27. "filename": "ipsum.txt",
  28. "data": "dGhpcyBpcwpqdXN0IHNvbWUgdGV4dAo="
  29. },
  30. {
  31. "filename": "test.txt",
  32. "data": "VGhpcyBpcyBhIHRlc3QK"
  33. }
  34. ]
  35. },
  36. )
  37. print(resp1)
  38. resp2 = client.get(
  39. index="my-index-000001",
  40. id="my_id",
  41. )
  42. print(resp2)

Ruby

  1. response = client.ingest.put_pipeline(
  2. id: 'attachment',
  3. body: {
  4. description: 'Extract attachment information from arrays',
  5. processors: [
  6. {
  7. foreach: {
  8. field: 'attachments',
  9. processor: {
  10. attachment: {
  11. target_field: '_ingest._value.attachment',
  12. field: '_ingest._value.data',
  13. remove_binary: false
  14. }
  15. }
  16. }
  17. }
  18. ]
  19. }
  20. )
  21. puts response
  22. response = client.index(
  23. index: 'my-index-000001',
  24. id: 'my_id',
  25. pipeline: 'attachment',
  26. body: {
  27. attachments: [
  28. {
  29. filename: 'ipsum.txt',
  30. data: 'dGhpcyBpcwpqdXN0IHNvbWUgdGV4dAo='
  31. },
  32. {
  33. filename: 'test.txt',
  34. data: 'VGhpcyBpcyBhIHRlc3QK'
  35. }
  36. ]
  37. }
  38. )
  39. puts response
  40. response = client.get(
  41. index: 'my-index-000001',
  42. id: 'my_id'
  43. )
  44. puts response

Js

  1. const response = await client.ingest.putPipeline({
  2. id: "attachment",
  3. description: "Extract attachment information from arrays",
  4. processors: [
  5. {
  6. foreach: {
  7. field: "attachments",
  8. processor: {
  9. attachment: {
  10. target_field: "_ingest._value.attachment",
  11. field: "_ingest._value.data",
  12. remove_binary: false,
  13. },
  14. },
  15. },
  16. },
  17. ],
  18. });
  19. console.log(response);
  20. const response1 = await client.index({
  21. index: "my-index-000001",
  22. id: "my_id",
  23. pipeline: "attachment",
  24. document: {
  25. attachments: [
  26. {
  27. filename: "ipsum.txt",
  28. data: "dGhpcyBpcwpqdXN0IHNvbWUgdGV4dAo=",
  29. },
  30. {
  31. filename: "test.txt",
  32. data: "VGhpcyBpcyBhIHRlc3QK",
  33. },
  34. ],
  35. },
  36. });
  37. console.log(response1);
  38. const response2 = await client.get({
  39. index: "my-index-000001",
  40. id: "my_id",
  41. });
  42. console.log(response2);

コンソール

  1. PUT _ingest/pipeline/attachment
  2. {
  3. "description" : "Extract attachment information from arrays",
  4. "processors" : [
  5. {
  6. "foreach": {
  7. "field": "attachments",
  8. "processor": {
  9. "attachment": {
  10. "target_field": "_ingest._value.attachment",
  11. "field": "_ingest._value.data",
  12. "remove_binary": false
  13. }
  14. }
  15. }
  16. }
  17. ]
  18. }
  19. PUT my-index-000001/_doc/my_id?pipeline=attachment
  20. {
  21. "attachments" : [
  22. {
  23. "filename" : "ipsum.txt",
  24. "data" : "dGhpcyBpcwpqdXN0IHNvbWUgdGV4dAo="
  25. },
  26. {
  27. "filename" : "test.txt",
  28. "data" : "VGhpcyBpcyBhIHRlc3QK"
  29. }
  30. ]
  31. }
  32. GET my-index-000001/_doc/my_id

これを返します:

コンソール-結果

  1. {
  2. "_index" : "my-index-000001",
  3. "_id" : "my_id",
  4. "_version" : 1,
  5. "_seq_no" : 50,
  6. "_primary_term" : 1,
  7. "found" : true,
  8. "_source" : {
  9. "attachments" : [
  10. {
  11. "filename" : "ipsum.txt",
  12. "data" : "dGhpcyBpcwpqdXN0IHNvbWUgdGV4dAo=",
  13. "attachment" : {
  14. "content_type" : "text/plain; charset=ISO-8859-1",
  15. "language" : "en",
  16. "content" : "this is\njust some text",
  17. "content_length" : 24
  18. }
  19. },
  20. {
  21. "filename" : "test.txt",
  22. "data" : "VGhpcyBpcyBhIHRlc3QK",
  23. "attachment" : {
  24. "content_type" : "text/plain; charset=ISO-8859-1",
  25. "language" : "en",
  26. "content" : "This is a test",
  27. "content_length" : 16
  28. }
  29. }
  30. ]
  31. }
  32. }

target_fieldを設定する必要があることに注意してください。そうしないと、デフォルト値が使用され、トップレベルフィールドattachmentが使用されます。このトップレベルフィールドのプロパティには、最初の添付ファイルの値のみが含まれます。ただし、target_field_ingest._valueの値に指定することで、プロパティが正しい添付ファイルに正しく関連付けられます。