フラット化フィールドタイプ

デフォルトでは、オブジェクト内の各サブフィールドは別々にマッピングされ、インデックスされます。サブフィールドの名前やタイプが事前にわからない場合、それらは動的にマッピングされます

  1. このデータタイプは、大量または未知の数のユニークキーを持つオブジェクトのインデックス作成に役立ちます。全体のJSONオブジェクトに対して1つのフィールドマッピングが作成され、あまりにも多くの異なるフィールドマッピングによる[mappings explosion](e690e01ae99d7d0f.md#mapping-limit-settings)を防ぐのに役立ちます。
  2. 一方で、フラット化されたオブジェクトフィールドは、検索機能に関してトレードオフを示します。基本的なクエリのみが許可され、数値範囲クエリやハイライトのサポートはありません。制限に関するさらなる情報は、[サポートされている操作](c59ef41400664546.md#supported-operations)セクションにあります。
  3. `````flattened`````マッピングタイプは、すべてのドキュメントコンテンツのインデックス作成には**使用しないでください**。これはすべての値をキーワードとして扱い、完全な検索機能を提供しません。各サブフィールドがマッピング内に独自のエントリを持つデフォルトのアプローチは、ほとんどのケースでうまく機能します。
  4. フラット化されたオブジェクトフィールドは、次のように作成できます:
  5. #### Python
  6. ``````python
  7. resp = client.indices.create(
  8. index="bug_reports",
  9. mappings={
  10. "properties": {
  11. "title": {
  12. "type": "text"
  13. },
  14. "labels": {
  15. "type": "flattened"
  16. }
  17. }
  18. },
  19. )
  20. print(resp)
  21. resp1 = client.index(
  22. index="bug_reports",
  23. id="1",
  24. document={
  25. "title": "Results are not sorted correctly.",
  26. "labels": {
  27. "priority": "urgent",
  28. "release": [
  29. "v1.2.5",
  30. "v1.3.0"
  31. ],
  32. "timestamp": {
  33. "created": 1541458026,
  34. "closed": 1541457010
  35. }
  36. }
  37. },
  38. )
  39. print(resp1)
  40. `

Ruby

  1. response = client.indices.create(
  2. index: 'bug_reports',
  3. body: {
  4. mappings: {
  5. properties: {
  6. title: {
  7. type: 'text'
  8. },
  9. labels: {
  10. type: 'flattened'
  11. }
  12. }
  13. }
  14. }
  15. )
  16. puts response
  17. response = client.index(
  18. index: 'bug_reports',
  19. id: 1,
  20. body: {
  21. title: 'Results are not sorted correctly.',
  22. labels: {
  23. priority: 'urgent',
  24. release: [
  25. 'v1.2.5',
  26. 'v1.3.0'
  27. ],
  28. timestamp: {
  29. created: 1_541_458_026,
  30. closed: 1_541_457_010
  31. }
  32. }
  33. }
  34. )
  35. puts response

Js

  1. const response = await client.indices.create({
  2. index: "bug_reports",
  3. mappings: {
  4. properties: {
  5. title: {
  6. type: "text",
  7. },
  8. labels: {
  9. type: "flattened",
  10. },
  11. },
  12. },
  13. });
  14. console.log(response);
  15. const response1 = await client.index({
  16. index: "bug_reports",
  17. id: 1,
  18. document: {
  19. title: "Results are not sorted correctly.",
  20. labels: {
  21. priority: "urgent",
  22. release: ["v1.2.5", "v1.3.0"],
  23. timestamp: {
  24. created: 1541458026,
  25. closed: 1541457010,
  26. },
  27. },
  28. },
  29. });
  30. console.log(response1);

コンソール

  1. PUT bug_reports
  2. {
  3. "mappings": {
  4. "properties": {
  5. "title": {
  6. "type": "text"
  7. },
  8. "labels": {
  9. "type": "flattened"
  10. }
  11. }
  12. }
  13. }
  14. POST bug_reports/_doc/1
  15. {
  16. "title": "Results are not sorted correctly.",
  17. "labels": {
  18. "priority": "urgent",
  19. "release": ["v1.2.5", "v1.3.0"],
  20. "timestamp": {
  21. "created": 1541458026,
  22. "closed": 1541457010
  23. }
  24. }
  25. }

インデックス作成中に、JSONオブジェクト内の各リーフ値に対してトークンが作成されます。値は文字列キーワードとしてインデックスされ、数値や日付に対する分析や特別な処理は行われません。

トップレベルのflattenedフィールドをクエリすると、オブジェクト内のすべてのリーフ値が検索されます:

Python

  1. resp = client.search(
  2. index="bug_reports",
  3. query={
  4. "term": {
  5. "labels": "urgent"
  6. }
  7. },
  8. )
  9. print(resp)

Ruby

  1. response = client.search(
  2. index: 'bug_reports',
  3. body: {
  4. query: {
  5. term: {
  6. labels: 'urgent'
  7. }
  8. }
  9. }
  10. )
  11. puts response

Js

  1. const response = await client.search({
  2. index: "bug_reports",
  3. query: {
  4. term: {
  5. labels: "urgent",
  6. },
  7. },
  8. });
  9. console.log(response);

コンソール

  1. POST bug_reports/_search
  2. {
  3. "query": {
  4. "term": {"labels": "urgent"}
  5. }
  6. }

フラット化されたオブジェクト内の特定のキーをクエリするには、オブジェクトドット表記を使用します:

Python

  1. resp = client.search(
  2. index="bug_reports",
  3. query={
  4. "term": {
  5. "labels.release": "v1.3.0"
  6. }
  7. },
  8. )
  9. print(resp)

Ruby

  1. response = client.search(
  2. index: 'bug_reports',
  3. body: {
  4. query: {
  5. term: {
  6. 'labels.release' => 'v1.3.0'
  7. }
  8. }
  9. }
  10. )
  11. puts response

Js

  1. const response = await client.search({
  2. index: "bug_reports",
  3. query: {
  4. term: {
  5. "labels.release": "v1.3.0",
  6. },
  7. },
  8. });
  9. console.log(response);

コンソール

  1. POST bug_reports/_search
  2. {
  3. "query": {
  4. "term": {"labels.release": "v1.3.0"}
  5. }
  6. }

サポートされている操作

値がインデックスされる方法の類似性のために、flattenedフィールドはkeywordフィールドと同じマッピングおよび検索機能の多くを共有します。

現在、フラット化されたオブジェクトフィールドは、次のクエリタイプで使用できます:

  • termterms、およびterms_set
  • prefix
  • range
  • matchおよびmulti_match
  • query_stringおよびsimple_query_string
  • exists

クエリを実行する際、{ "term": {"labels.time*": 1541457010}}のようにワイルドカードを使用してフィールドキーを参照することはできません。すべてのクエリ、rangeを含む、は値を文字列キーワードとして扱います。flattenedフィールドでのハイライトはサポートされていません。

フラット化されたオブジェクトフィールドでソートを行うことができ、termsのようなシンプルなキーワードスタイルの集計を実行することもできます。クエリと同様に、数値に対する特別なサポートはありません。JSONオブジェクト内のすべての値はキーワードとして扱われます。ソート時には、値が辞書式に比較されることを意味します。

現在、フラット化されたオブジェクトフィールドは保存できません。マッピング内でstoreパラメータを指定することはできません。

フラット化されたフィールドの取得

フィールド値と具体的なサブフィールドは、fieldsパラメータを使用して取得できます。flattenedフィールドは、潜在的に多くのサブフィールドを持つ全体のオブジェクトを単一のフィールドとしてマッピングするため、応答には_sourceからの変更されていない構造が含まれます。

ただし、単一のサブフィールドは、リクエスト内で明示的に指定することによって取得できます。これは具体的なパスに対してのみ機能し、ワイルドカードを使用することはできません:

Python

  1. resp = client.indices.create(
  2. index="my-index-000001",
  3. mappings={
  4. "properties": {
  5. "flattened_field": {
  6. "type": "flattened"
  7. }
  8. }
  9. },
  10. )
  11. print(resp)
  12. resp1 = client.index(
  13. index="my-index-000001",
  14. id="1",
  15. refresh=True,
  16. document={
  17. "flattened_field": {
  18. "subfield": "value"
  19. }
  20. },
  21. )
  22. print(resp1)
  23. resp2 = client.search(
  24. index="my-index-000001",
  25. fields=[
  26. "flattened_field.subfield"
  27. ],
  28. source=False,
  29. )
  30. print(resp2)

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000001',
  3. body: {
  4. mappings: {
  5. properties: {
  6. flattened_field: {
  7. type: 'flattened'
  8. }
  9. }
  10. }
  11. }
  12. )
  13. puts response
  14. response = client.index(
  15. index: 'my-index-000001',
  16. id: 1,
  17. refresh: true,
  18. body: {
  19. flattened_field: {
  20. subfield: 'value'
  21. }
  22. }
  23. )
  24. puts response
  25. response = client.search(
  26. index: 'my-index-000001',
  27. body: {
  28. fields: [
  29. 'flattened_field.subfield'
  30. ],
  31. _source: false
  32. }
  33. )
  34. puts response

Js

  1. const response = await client.indices.create({
  2. index: "my-index-000001",
  3. mappings: {
  4. properties: {
  5. flattened_field: {
  6. type: "flattened",
  7. },
  8. },
  9. },
  10. });
  11. console.log(response);
  12. const response1 = await client.index({
  13. index: "my-index-000001",
  14. id: 1,
  15. refresh: "true",
  16. document: {
  17. flattened_field: {
  18. subfield: "value",
  19. },
  20. },
  21. });
  22. console.log(response1);
  23. const response2 = await client.search({
  24. index: "my-index-000001",
  25. fields: ["flattened_field.subfield"],
  26. _source: false,
  27. });
  28. console.log(response2);

コンソール

  1. PUT my-index-000001
  2. {
  3. "mappings": {
  4. "properties": {
  5. "flattened_field": {
  6. "type": "flattened"
  7. }
  8. }
  9. }
  10. }
  11. PUT my-index-000001/_doc/1?refresh=true
  12. {
  13. "flattened_field" : {
  14. "subfield" : "value"
  15. }
  16. }
  17. POST my-index-000001/_search
  18. {
  19. "fields": ["flattened_field.subfield"],
  20. "_source": false
  21. }

コンソール-結果

  1. {
  2. "took": 2,
  3. "timed_out": false,
  4. "_shards": {
  5. "total": 1,
  6. "successful": 1,
  7. "skipped": 0,
  8. "failed": 0
  9. },
  10. "hits": {
  11. "total": {
  12. "value": 1,
  13. "relation": "eq"
  14. },
  15. "max_score": 1.0,
  16. "hits": [{
  17. "_index": "my-index-000001",
  18. "_id": "1",
  19. "_score": 1.0,
  20. "fields": {
  21. "flattened_field.subfield" : [ "value" ]
  22. }
  23. }]
  24. }
  25. }

サブフィールドからフラット化されたフィールドの値を取得するために、Painlessスクリプトを使用することもできます。Painlessスクリプトにdoc['<field_name>'].valueを含める代わりに、doc['<field_name>.<sub-field_name>'].valueを使用します。たとえば、releaseサブフィールドを持つlabelというフラット化されたフィールドがある場合、あなたのPainlessスクリプトはdoc['labels.release'].valueになります。

たとえば、マッピングにflattenedタイプのフィールドが1つ含まれているとしましょう:

Python

  1. resp = client.indices.create(
  2. index="my-index-000001",
  3. mappings={
  4. "properties": {
  5. "title": {
  6. "type": "text"
  7. },
  8. "labels": {
  9. "type": "flattened"
  10. }
  11. }
  12. },
  13. )
  14. print(resp)

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000001',
  3. body: {
  4. mappings: {
  5. properties: {
  6. title: {
  7. type: 'text'
  8. },
  9. labels: {
  10. type: 'flattened'
  11. }
  12. }
  13. }
  14. }
  15. )
  16. puts response

Js

  1. const response = await client.indices.create({
  2. index: "my-index-000001",
  3. mappings: {
  4. properties: {
  5. title: {
  6. type: "text",
  7. },
  8. labels: {
  9. type: "flattened",
  10. },
  11. },
  12. },
  13. });
  14. console.log(response);

コンソール

  1. PUT my-index-000001
  2. {
  3. "mappings": {
  4. "properties": {
  5. "title": {
  6. "type": "text"
  7. },
  8. "labels": {
  9. "type": "flattened"
  10. }
  11. }
  12. }
  13. }

マッピングされたフィールドを含むいくつかのドキュメントをインデックスします。labelsフィールドには3つのサブフィールドがあります:

Python

  1. resp = client.bulk(
  2. index="my-index-000001",
  3. refresh=True,
  4. operations=[
  5. {
  6. "index": {}
  7. },
  8. {
  9. "title": "Something really urgent",
  10. "labels": {
  11. "priority": "urgent",
  12. "release": [
  13. "v1.2.5",
  14. "v1.3.0"
  15. ],
  16. "timestamp": {
  17. "created": 1541458026,
  18. "closed": 1541457010
  19. }
  20. }
  21. },
  22. {
  23. "index": {}
  24. },
  25. {
  26. "title": "Somewhat less urgent",
  27. "labels": {
  28. "priority": "high",
  29. "release": [
  30. "v1.3.0"
  31. ],
  32. "timestamp": {
  33. "created": 1541458026,
  34. "closed": 1541457010
  35. }
  36. }
  37. },
  38. {
  39. "index": {}
  40. },
  41. {
  42. "title": "Not urgent",
  43. "labels": {
  44. "priority": "low",
  45. "release": [
  46. "v1.2.0"
  47. ],
  48. "timestamp": {
  49. "created": 1541458026,
  50. "closed": 1541457010
  51. }
  52. }
  53. }
  54. ],
  55. )
  56. print(resp)

Ruby

  1. response = client.bulk(
  2. index: 'my-index-000001',
  3. refresh: true,
  4. body: [
  5. {
  6. index: {}
  7. },
  8. {
  9. title: 'Something really urgent',
  10. labels: {
  11. priority: 'urgent',
  12. release: [
  13. 'v1.2.5',
  14. 'v1.3.0'
  15. ],
  16. timestamp: {
  17. created: 1_541_458_026,
  18. closed: 1_541_457_010
  19. }
  20. }
  21. },
  22. {
  23. index: {}
  24. },
  25. {
  26. title: 'Somewhat less urgent',
  27. labels: {
  28. priority: 'high',
  29. release: [
  30. 'v1.3.0'
  31. ],
  32. timestamp: {
  33. created: 1_541_458_026,
  34. closed: 1_541_457_010
  35. }
  36. }
  37. },
  38. {
  39. index: {}
  40. },
  41. {
  42. title: 'Not urgent',
  43. labels: {
  44. priority: 'low',
  45. release: [
  46. 'v1.2.0'
  47. ],
  48. timestamp: {
  49. created: 1_541_458_026,
  50. closed: 1_541_457_010
  51. }
  52. }
  53. }
  54. ]
  55. )
  56. puts response

Js

  1. const response = await client.bulk({
  2. index: "my-index-000001",
  3. refresh: "true",
  4. operations: [
  5. {
  6. index: {},
  7. },
  8. {
  9. title: "Something really urgent",
  10. labels: {
  11. priority: "urgent",
  12. release: ["v1.2.5", "v1.3.0"],
  13. timestamp: {
  14. created: 1541458026,
  15. closed: 1541457010,
  16. },
  17. },
  18. },
  19. {
  20. index: {},
  21. },
  22. {
  23. title: "Somewhat less urgent",
  24. labels: {
  25. priority: "high",
  26. release: ["v1.3.0"],
  27. timestamp: {
  28. created: 1541458026,
  29. closed: 1541457010,
  30. },
  31. },
  32. },
  33. {
  34. index: {},
  35. },
  36. {
  37. title: "Not urgent",
  38. labels: {
  39. priority: "low",
  40. release: ["v1.2.0"],
  41. timestamp: {
  42. created: 1541458026,
  43. closed: 1541457010,
  44. },
  45. },
  46. },
  47. ],
  48. });
  49. console.log(response);

コンソール

  1. POST /my-index-000001/_bulk?refresh
  2. {"index":{}}
  3. {"title":"Something really urgent","labels":{"priority":"urgent","release":["v1.2.5","v1.3.0"],"timestamp":{"created":1541458026,"closed":1541457010}}}
  4. {"index":{}}
  5. {"title":"Somewhat less urgent","labels":{"priority":"high","release":["v1.3.0"],"timestamp":{"created":1541458026,"closed":1541457010}}}
  6. {"index":{}}
  7. {"title":"Not urgent","labels":{"priority":"low","release":["v1.2.0"],"timestamp":{"created":1541458026,"closed":1541457010}}}
  1. #### Painless
  2. ``````painless
  3. "script": {
  4. "source": """
  5. if (doc['labels.release'].value.equals('v1.3.0'))
  6. {emit(doc['labels.release'].value)}
  7. else{emit('Version mismatch')}
  8. """
  9. `

フラット化されたオブジェクトフィールドのパラメータ

次のマッピングパラメータが受け入れられます:

depth_limit ネストされた内側のオブジェクトの観点から、フラット化されたオブジェクトフィールドの最大許可深度。フラット化されたオブジェクトフィールドがこの制限を超えると、エラーが発生します。デフォルトは20です。depth_limitは、マッピングの更新 APIを通じて動的に更新できます。
doc_values フィールドは、後でソート、集計、またはスクリプトに使用できるように、ディスクにカラムストライド方式で保存されるべきですか?true(デフォルト)またはfalseを受け入れます。
eager_global_ordinals グローバルオーディナルはリフレッシュ時に早期にロードされるべきですか?trueまたはfalse(デフォルト)を受け入れます。これは、用語集計に頻繁に使用されるフィールドに対して良いアイデアです。
ignore_above この制限を超えるリーフ値はインデックスされません。デフォルトでは制限はなく、すべての値がインデックスされます。この制限は、フラット化されたオブジェクトフィールド内のリーフ値に適用され、フィールド全体の長さには適用されません。
index フィールドが検索可能であるべきかどうかを決定します。true(デフォルト)またはfalseを受け入れます。
index_options スコアリング目的でインデックスに保存されるべき情報。デフォルトはdocsですが、スコアを計算する際に用語頻度を考慮するためにfreqsに設定することもできます。
null_value フラット化されたオブジェクトフィールド内の明示的なnull値の代わりに置き換えられる文字列値。デフォルトはnullで、これはnullフィールドが欠落しているかのように扱われることを意味します。
similarity 使用するスコアリングアルゴリズムまたは類似性。デフォルトはBM25です。
split_queries_on_whitespace 全文検索クエリがこのフィールドのクエリを構築する際に入力をホワイトスペースで分割するべきかどうか。trueまたはfalse(デフォルト)を受け入れます。

| time_series_dimensions | (オプション、文字列の配列)フラット化されたオブジェクト内のフィールドのリストで、各フィールドは時系列の次元です。各フィールドは、ルートフィールドからの相対パスを使用して指定され、ルートフィールド名は含まれません。

合成 _source

合成_sourceは、一般的にTSDBインデックス(index.modetime_seriesに設定されているインデックス)のみで利用可能です。他のインデックスでは、合成_sourceは技術プレビュー中です。技術プレビュー中の機能は、将来のリリースで変更または削除される可能性があります。Elasticは問題を修正するために作業しますが、技術プレビュー中の機能は公式GA機能のサポートSLAの対象ではありません。

フラット化されたフィールドは、デフォルト設定で合成_sourceをサポートします。合成_sourceは、doc_valuesが無効になっている場合には使用できません。

合成ソースは常にアルファベット順にソートされ、フラット化されたフィールドを重複排除します。たとえば:

Python

  1. resp = client.indices.create(
  2. index="idx",
  3. mappings={
  4. "_source": {
  5. "mode": "synthetic"
  6. },
  7. "properties": {
  8. "flattened": {
  9. "type": "flattened"
  10. }
  11. }
  12. },
  13. )
  14. print(resp)
  15. resp1 = client.index(
  16. index="idx",
  17. id="1",
  18. document={
  19. "flattened": {
  20. "field": [
  21. "apple",
  22. "apple",
  23. "banana",
  24. "avocado",
  25. "10",
  26. "200",
  27. "AVOCADO",
  28. "Banana",
  29. "Tangerine"
  30. ]
  31. }
  32. },
  33. )
  34. print(resp1)

Ruby

  1. response = client.indices.create(
  2. index: 'idx',
  3. body: {
  4. mappings: {
  5. _source: {
  6. mode: 'synthetic'
  7. },
  8. properties: {
  9. flattened: {
  10. type: 'flattened'
  11. }
  12. }
  13. }
  14. }
  15. )
  16. puts response
  17. response = client.index(
  18. index: 'idx',
  19. id: 1,
  20. body: {
  21. flattened: {
  22. field: [
  23. 'apple',
  24. 'apple',
  25. 'banana',
  26. 'avocado',
  27. '10',
  28. '200',
  29. 'AVOCADO',
  30. 'Banana',
  31. 'Tangerine'
  32. ]
  33. }
  34. }
  35. )
  36. puts response

Js

  1. const response = await client.indices.create({
  2. index: "idx",
  3. mappings: {
  4. _source: {
  5. mode: "synthetic",
  6. },
  7. properties: {
  8. flattened: {
  9. type: "flattened",
  10. },
  11. },
  12. },
  13. });
  14. console.log(response);
  15. const response1 = await client.index({
  16. index: "idx",
  17. id: 1,
  18. document: {
  19. flattened: {
  20. field: [
  21. "apple",
  22. "apple",
  23. "banana",
  24. "avocado",
  25. "10",
  26. "200",
  27. "AVOCADO",
  28. "Banana",
  29. "Tangerine",
  30. ],
  31. },
  32. },
  33. });
  34. console.log(response1);

コンソール

  1. PUT idx
  2. {
  3. "mappings": {
  4. "_source": { "mode": "synthetic" },
  5. "properties": {
  6. "flattened": { "type": "flattened" }
  7. }
  8. }
  9. }
  10. PUT idx/_doc/1
  11. {
  12. "flattened": {
  13. "field": [ "apple", "apple", "banana", "avocado", "10", "200", "AVOCADO", "Banana", "Tangerine" ]
  14. }
  15. }

次のようになります:

コンソール-結果

  1. {
  2. "flattened": {
  3. "field": [ "10", "200", "AVOCADO", "Banana", "Tangerine", "apple", "avocado", "banana" ]
  4. }
  5. }

合成ソースは常にオブジェクトの配列の代わりにネストされたオブジェクトを使用します。たとえば:

Python

  1. resp = client.indices.create(
  2. index="idx",
  3. mappings={
  4. "_source": {
  5. "mode": "synthetic"
  6. },
  7. "properties": {
  8. "flattened": {
  9. "type": "flattened"
  10. }
  11. }
  12. },
  13. )
  14. print(resp)
  15. resp1 = client.index(
  16. index="idx",
  17. id="1",
  18. document={
  19. "flattened": {
  20. "field": [
  21. {
  22. "id": 1,
  23. "name": "foo"
  24. },
  25. {
  26. "id": 2,
  27. "name": "bar"
  28. },
  29. {
  30. "id": 3,
  31. "name": "baz"
  32. }
  33. ]
  34. }
  35. },
  36. )
  37. print(resp1)

Ruby

  1. response = client.indices.create(
  2. index: 'idx',
  3. body: {
  4. mappings: {
  5. _source: {
  6. mode: 'synthetic'
  7. },
  8. properties: {
  9. flattened: {
  10. type: 'flattened'
  11. }
  12. }
  13. }
  14. }
  15. )
  16. puts response
  17. response = client.index(
  18. index: 'idx',
  19. id: 1,
  20. body: {
  21. flattened: {
  22. field: [
  23. {
  24. id: 1,
  25. name: 'foo'
  26. },
  27. {
  28. id: 2,
  29. name: 'bar'
  30. },
  31. {
  32. id: 3,
  33. name: 'baz'
  34. }
  35. ]
  36. }
  37. }
  38. )
  39. puts response

Js

  1. const response = await client.indices.create({
  2. index: "idx",
  3. mappings: {
  4. _source: {
  5. mode: "synthetic",
  6. },
  7. properties: {
  8. flattened: {
  9. type: "flattened",
  10. },
  11. },
  12. },
  13. });
  14. console.log(response);
  15. const response1 = await client.index({
  16. index: "idx",
  17. id: 1,
  18. document: {
  19. flattened: {
  20. field: [
  21. {
  22. id: 1,
  23. name: "foo",
  24. },
  25. {
  26. id: 2,
  27. name: "bar",
  28. },
  29. {
  30. id: 3,
  31. name: "baz",
  32. },
  33. ],
  34. },
  35. },
  36. });
  37. console.log(response1);

コンソール

  1. PUT idx
  2. {
  3. "mappings": {
  4. "_source": { "mode": "synthetic" },
  5. "properties": {
  6. "flattened": { "type": "flattened" }
  7. }
  8. }
  9. }
  10. PUT idx/_doc/1
  11. {
  12. "flattened": {
  13. "field": [
  14. { "id": 1, "name": "foo" },
  15. { "id": 2, "name": "bar" },
  16. { "id": 3, "name": "baz" }
  17. ]
  18. }
  19. }

次のようになります(「フラット化された」配列の代わりにネストされたオブジェクトに注意):

コンソール-結果

  1. {
  2. "flattened": {
  3. "field": {
  4. "id": [ "1", "2", "3" ],
  5. "name": [ "bar", "baz", "foo" ]
  6. }
  7. }
  8. }

合成ソースは常に1要素の配列に対して単一値フィールドを使用します。たとえば:

Python

  1. resp = client.indices.create(
  2. index="idx",
  3. mappings={
  4. "_source": {
  5. "mode": "synthetic"
  6. },
  7. "properties": {
  8. "flattened": {
  9. "type": "flattened"
  10. }
  11. }
  12. },
  13. )
  14. print(resp)
  15. resp1 = client.index(
  16. index="idx",
  17. id="1",
  18. document={
  19. "flattened": {
  20. "field": [
  21. "foo"
  22. ]
  23. }
  24. },
  25. )
  26. print(resp1)

Ruby

  1. response = client.indices.create(
  2. index: 'idx',
  3. body: {
  4. mappings: {
  5. _source: {
  6. mode: 'synthetic'
  7. },
  8. properties: {
  9. flattened: {
  10. type: 'flattened'
  11. }
  12. }
  13. }
  14. }
  15. )
  16. puts response
  17. response = client.index(
  18. index: 'idx',
  19. id: 1,
  20. body: {
  21. flattened: {
  22. field: [
  23. 'foo'
  24. ]
  25. }
  26. }
  27. )
  28. puts response

Js

  1. const response = await client.indices.create({
  2. index: "idx",
  3. mappings: {
  4. _source: {
  5. mode: "synthetic",
  6. },
  7. properties: {
  8. flattened: {
  9. type: "flattened",
  10. },
  11. },
  12. },
  13. });
  14. console.log(response);
  15. const response1 = await client.index({
  16. index: "idx",
  17. id: 1,
  18. document: {
  19. flattened: {
  20. field: ["foo"],
  21. },
  22. },
  23. });
  24. console.log(response1);

コンソール

  1. PUT idx
  2. {
  3. "mappings": {
  4. "_source": { "mode": "synthetic" },
  5. "properties": {
  6. "flattened": { "type": "flattened" }
  7. }
  8. }
  9. }
  10. PUT idx/_doc/1
  11. {
  12. "flattened": {
  13. "field": [ "foo" ]
  14. }
  15. }

次のようになります(「フラット化された」配列の代わりにネストされたオブジェクトに注意):

コンソール-結果

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