動的テンプレート

動的テンプレートを使用すると、Elasticsearchがデータをマッピングする方法を、デフォルトの 動的フィールドマッピングルールを超えてより細かく制御できます。動的マッピングは、dynamicパラメータをtrueまたはruntimeに設定することで有効にします。その後、動的テンプレートを使用して、マッチ条件に基づいて動的に追加されたフィールドに適用できるカスタムマッピングを定義できます:

  • match_mapping_typeunmatch_mapping_typeは、Elasticsearchが検出したデータ型に対して動作します
  • matchunmatchは、フィールド名に対してパターンを使用してマッチします
  • path_matchpath_unmatchは、フィールドへの完全なドットパスに対して動作します
  • 動的テンプレートがmatch_mapping_typematch、またはpath_matchを定義していない場合、どのフィールドにもマッチしません。それでも、バルクリクエストdynamic_templatesセクションで名前でテンプレートを参照できます。

マッピング仕様で{name}{dynamic_type} テンプレート変数をプレースホルダーとして使用します。

動的フィールドマッピングは、フィールドが具体的な値を含む場合にのみ追加されます。フィールドがnullまたは空の配列を含む場合、Elasticsearchは動的フィールドマッピングを追加しません。null_valueオプションがdynamic_templateで使用される場合、フィールドに具体的な値を持つ最初のドキュメントがインデックスされた後にのみ適用されます。

動的テンプレートは、名前付きオブジェクトの配列として指定されます:

Js

  1. "dynamic_templates": [
  2. {
  3. "my_template_name": {
  4. ... match conditions ...
  5. "mapping": { ... }
  6. }
  7. },
  8. ...
  9. ]
テンプレート名は任意の文字列値にできます。
マッチ条件には、match_mapping_typematchmatch_patternunmatchpath_matchpath_unmatchのいずれかを含めることができます。
マッチしたフィールドが使用すべきマッピング。

動的テンプレートの検証

提供されたマッピングに無効なマッピングスニペットが含まれている場合、検証エラーが返されます。検証は、インデックス時に動的テンプレートを適用する際に発生し、ほとんどの場合、動的テンプレートが更新されるときにも発生します。無効なマッピングスニペットを提供すると、特定の条件下で動的テンプレートの更新または検証が失敗する可能性があります:

  • match_mapping_typeが指定されていないが、テンプレートが少なくとも1つの事前定義されたマッピングタイプに対して有効な場合、マッピングスニペットは有効と見なされます。ただし、テンプレートにマッチするフィールドが異なるタイプとしてインデックスされると、インデックス時に検証エラーが返されます。たとえば、match_mapping_typeを指定しない動的テンプレートを設定することは文字列型として有効と見なされますが、動的テンプレートにマッチするフィールドがlongとしてインデックスされると、インデックス時に検証エラーが返されます。match_mapping_typeを期待されるJSON型に設定するか、マッピングスニペットで希望するtypeを設定することをお勧めします。
  • マッピングスニペットで{name}プレースホルダーが使用されている場合、動的テンプレートの更新時に検証はスキップされます。これは、その時点でフィールド名が不明であるためです。代わりに、テンプレートがインデックス時に適用されるときに検証が行われます。

テンプレートは順番に処理されます—最初にマッチしたテンプレートが勝ちます。マッピングの更新 APIを通じて新しい動的テンプレートを追加すると、すべての既存のテンプレートが上書きされます。これにより、動的テンプレートを初期追加後に再配置または削除することができます。

動的テンプレートにおけるランタイムフィールドのマッピング

Elasticsearchに特定のタイプの新しいフィールドをランタイムフィールドとして動的にマッピングさせたい場合は、インデックスマッピングで"dynamic":"runtime"を設定します。これらのフィールドはインデックスされず、クエリ時に_sourceから読み込まれます。

または、デフォルトの動的マッピングルールを使用し、特定のフィールドをランタイムフィールドとしてマッピングするための動的テンプレートを作成することもできます。インデックスマッピングで"dynamic":"true"を設定し、その後、特定のタイプの新しいフィールドをランタイムフィールドとしてマッピングするための動的テンプレートを作成します。

たとえば、各フィールドがip_で始まるデータがあるとします。動的マッピングルールに基づいて、Elasticsearchはstringnumeric検出を通過する場合、floatまたはlongとしてマッピングします。ただし、新しい文字列をip型のランタイムフィールドとしてマッピングする動的テンプレートを作成できます。

次のリクエストは、strings_as_ipという名前の動的テンプレートを定義します。Elasticsearchがip*パターンにマッチする新しいstringフィールドを検出すると、それらのフィールドはip型のランタイムフィールドとしてマッピングされます。ipフィールドは動的にマッピングされないため、このテンプレートは"dynamic":"true"または"dynamic":"runtime"のいずれかで使用できます。

Python

  1. resp = client.indices.create(
  2. index="my-index-000001",
  3. mappings={
  4. "dynamic_templates": [
  5. {
  6. "strings_as_ip": {
  7. "match_mapping_type": "string",
  8. "match": "ip*",
  9. "runtime": {
  10. "type": "ip"
  11. }
  12. }
  13. }
  14. ]
  15. },
  16. )
  17. print(resp)

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000001',
  3. body: {
  4. mappings: {
  5. dynamic_templates: [
  6. {
  7. strings_as_ip: {
  8. match_mapping_type: 'string',
  9. match: 'ip*',
  10. runtime: {
  11. type: 'ip'
  12. }
  13. }
  14. }
  15. ]
  16. }
  17. }
  18. )
  19. puts response

Js

  1. const response = await client.indices.create({
  2. index: "my-index-000001",
  3. mappings: {
  4. dynamic_templates: [
  5. {
  6. strings_as_ip: {
  7. match_mapping_type: "string",
  8. match: "ip*",
  9. runtime: {
  10. type: "ip",
  11. },
  12. },
  13. },
  14. ],
  15. },
  16. });
  17. console.log(response);

Console

  1. PUT my-index-000001/
  2. {
  3. "mappings": {
  4. "dynamic_templates": [
  5. {
  6. "strings_as_ip": {
  7. "match_mapping_type": "string",
  8. "match": "ip*",
  9. "runtime": {
  10. "type": "ip"
  11. }
  12. }
  13. }
  14. ]
  15. }
  16. }

このを参照して、動的テンプレートを使用してstringフィールドをインデックスフィールドまたはランタイムフィールドとしてマッピングする方法を確認してください。

match_mapping_typeとunmatch_mapping_type

  1. JSON`````long``````````integer`````、または`````double``````````float`````を区別しないため、解析された浮動小数点数は`````double````` JSONデータ型と見なされ、解析された`````integer`````数は`````long`````と見なされます。
  2. 動的マッピングでは、Elasticsearchは常に広いデータ型を選択します。唯一の例外は`````float`````で、これは`````double`````よりも少ないストレージスペースを必要とし、ほとんどのアプリケーションに対して十分な精度を持っています。ランタイムフィールドは`````float`````をサポートしていないため、`````"dynamic":"runtime"``````````double`````を使用します。
  3. Elasticsearchは次のデータ型を自動的に検出します:
  4. | | | |
  5. | --- | --- | --- |
  6. | | **Elasticsearchデータ型** |
  7. | **JSONデータ型** | **`````"dynamic":"true"`````** | **`````"dynamic":"runtime"`````** |
  8. | `````null````` | フィールドが追加されていません | フィールドが追加されていません |
  9. | `````true`````または`````false````` | `````boolean````` | `````boolean````` |
  10. | `````double````` | `````float````` | `````double````` |
  11. | `````long````` | `````long````` | `````long````` |
  12. | `````object````` | `````object````` | フィールドが追加されていません |
  13. | `````array````` | 配列内の最初の非`````null`````値に依存 | 配列内の最初の非`````null`````値に依存 |
  14. | `````string`````が[日付検出](56049773a26d4fae.md#date-detection "Date detection")を通過する | `````date````` | `````date````` |
  15. | `````string`````が[数値検出](56049773a26d4fae.md#numeric-detection "Numeric detection")を通過する | `````float`````または`````long````` | `````double`````または`````long````` |
  16. | `````string``````````date`````検出または`````numeric`````検出を通過しない | `````text``````````.keyword`````サブフィールドを持つ | `````keyword````` |
  17. `````match_mapping_type`````または`````unmatch_mapping_type`````パラメータに対して、単一のデータ型またはデータ型のリストを指定できます。`````*`````パラメータにワイルドカードを使用して、すべてのデータ型をマッチさせることもできます。
  18. たとえば、すべての整数フィールドを`````integer`````としてマッピングし、すべての`````string`````フィールドを`````text`````および`````keyword`````の両方としてマッピングしたい場合、次のテンプレートを使用できます:
  19. #### Python
  20. ``````python
  21. resp = client.indices.create(
  22. index="my-index-000001",
  23. mappings={
  24. "dynamic_templates": [
  25. {
  26. "numeric_counts": {
  27. "match_mapping_type": [
  28. "long",
  29. "double"
  30. ],
  31. "match": "count",
  32. "mapping": {
  33. "type": "{dynamic_type}",
  34. "index": False
  35. }
  36. }
  37. },
  38. {
  39. "integers": {
  40. "match_mapping_type": "long",
  41. "mapping": {
  42. "type": "integer"
  43. }
  44. }
  45. },
  46. {
  47. "strings": {
  48. "match_mapping_type": "string",
  49. "mapping": {
  50. "type": "text",
  51. "fields": {
  52. "raw": {
  53. "type": "keyword",
  54. "ignore_above": 256
  55. }
  56. }
  57. }
  58. }
  59. },
  60. {
  61. "non_objects_keyword": {
  62. "match_mapping_type": "*",
  63. "unmatch_mapping_type": "object",
  64. "mapping": {
  65. "type": "keyword"
  66. }
  67. }
  68. }
  69. ]
  70. },
  71. )
  72. print(resp)
  73. resp1 = client.index(
  74. index="my-index-000001",
  75. id="1",
  76. document={
  77. "my_integer": 5,
  78. "my_string": "Some string",
  79. "my_boolean": "false",
  80. "field": {
  81. "count": 4
  82. }
  83. },
  84. )
  85. print(resp1)
  86. `

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000001',
  3. body: {
  4. mappings: {
  5. dynamic_templates: [
  6. {
  7. numeric_counts: {
  8. match_mapping_type: [
  9. 'long',
  10. 'double'
  11. ],
  12. match: 'count',
  13. mapping: {
  14. type: '{dynamic_type}',
  15. index: false
  16. }
  17. }
  18. },
  19. {
  20. integers: {
  21. match_mapping_type: 'long',
  22. mapping: {
  23. type: 'integer'
  24. }
  25. }
  26. },
  27. {
  28. strings: {
  29. match_mapping_type: 'string',
  30. mapping: {
  31. type: 'text',
  32. fields: {
  33. raw: {
  34. type: 'keyword',
  35. ignore_above: 256
  36. }
  37. }
  38. }
  39. }
  40. },
  41. {
  42. non_objects_keyword: {
  43. match_mapping_type: '*',
  44. unmatch_mapping_type: 'object',
  45. mapping: {
  46. type: 'keyword'
  47. }
  48. }
  49. }
  50. ]
  51. }
  52. }
  53. )
  54. puts response
  55. response = client.index(
  56. index: 'my-index-000001',
  57. id: 1,
  58. body: {
  59. my_integer: 5,
  60. my_string: 'Some string',
  61. my_boolean: 'false',
  62. field: {
  63. count: 4
  64. }
  65. }
  66. )
  67. puts response

Js

  1. const response = await client.indices.create({
  2. index: "my-index-000001",
  3. mappings: {
  4. dynamic_templates: [
  5. {
  6. numeric_counts: {
  7. match_mapping_type: ["long", "double"],
  8. match: "count",
  9. mapping: {
  10. type: "{dynamic_type}",
  11. index: false,
  12. },
  13. },
  14. },
  15. {
  16. integers: {
  17. match_mapping_type: "long",
  18. mapping: {
  19. type: "integer",
  20. },
  21. },
  22. },
  23. {
  24. strings: {
  25. match_mapping_type: "string",
  26. mapping: {
  27. type: "text",
  28. fields: {
  29. raw: {
  30. type: "keyword",
  31. ignore_above: 256,
  32. },
  33. },
  34. },
  35. },
  36. },
  37. {
  38. non_objects_keyword: {
  39. match_mapping_type: "*",
  40. unmatch_mapping_type: "object",
  41. mapping: {
  42. type: "keyword",
  43. },
  44. },
  45. },
  46. ],
  47. },
  48. });
  49. console.log(response);
  50. const response1 = await client.index({
  51. index: "my-index-000001",
  52. id: 1,
  53. document: {
  54. my_integer: 5,
  55. my_string: "Some string",
  56. my_boolean: "false",
  57. field: {
  58. count: 4,
  59. },
  60. },
  61. });
  62. console.log(response1);

Console

  1. PUT my-index-000001
  2. {
  3. "mappings": {
  4. "dynamic_templates": [
  5. {
  6. "numeric_counts": {
  7. "match_mapping_type": ["long", "double"],
  8. "match": "count",
  9. "mapping": {
  10. "type": "{dynamic_type}",
  11. "index": false
  12. }
  13. }
  14. },
  15. {
  16. "integers": {
  17. "match_mapping_type": "long",
  18. "mapping": {
  19. "type": "integer"
  20. }
  21. }
  22. },
  23. {
  24. "strings": {
  25. "match_mapping_type": "string",
  26. "mapping": {
  27. "type": "text",
  28. "fields": {
  29. "raw": {
  30. "type": "keyword",
  31. "ignore_above": 256
  32. }
  33. }
  34. }
  35. }
  36. },
  37. {
  38. "non_objects_keyword": {
  39. "match_mapping_type": "*",
  40. "unmatch_mapping_type": "object",
  41. "mapping": {
  42. "type": "keyword"
  43. }
  44. }
  45. }
  46. ]
  47. }
  48. }
  49. PUT my-index-000001/_doc/1
  50. {
  51. "my_integer": 5,
  52. "my_string": "Some string",
  53. "my_boolean": "false",
  54. "field": {"count": 4}
  55. }
my_integerフィールドはintegerとしてマッピングされます。
my_stringフィールドはtextとしてマッピングされ、keyword マルチフィールドを持ちます。
my_booleanフィールドはkeywordとしてマッピングされます。
field.countフィールドはlongとしてマッピングされます。

マッチとアンマッチ

  1. `````match_pattern`````パラメータは、フィールド名に対して単純なワイルドカードの代わりに完全なJava正規表現マッチングをサポートするために`````match`````パラメータの動作を調整します。たとえば:
  2. #### Js
  3. ``````js
  4. "match_pattern": "regex",
  5. "match": "^profit_\d+$"
  6. `

次の例は、stringフィールドの名前がlong_で始まるすべてのフィールド(_textで終わるものを除く)をマッチさせ、longフィールドとしてマッピングします:

Python

  1. resp = client.indices.create(
  2. index="my-index-000001",
  3. mappings={
  4. "dynamic_templates": [
  5. {
  6. "longs_as_strings": {
  7. "match_mapping_type": "string",
  8. "match": "long_*",
  9. "unmatch": "*_text",
  10. "mapping": {
  11. "type": "long"
  12. }
  13. }
  14. }
  15. ]
  16. },
  17. )
  18. print(resp)
  19. resp1 = client.index(
  20. index="my-index-000001",
  21. id="1",
  22. document={
  23. "long_num": "5",
  24. "long_text": "foo"
  25. },
  26. )
  27. print(resp1)

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000001',
  3. body: {
  4. mappings: {
  5. dynamic_templates: [
  6. {
  7. longs_as_strings: {
  8. match_mapping_type: 'string',
  9. match: 'long_*',
  10. unmatch: '*_text',
  11. mapping: {
  12. type: 'long'
  13. }
  14. }
  15. }
  16. ]
  17. }
  18. }
  19. )
  20. puts response
  21. response = client.index(
  22. index: 'my-index-000001',
  23. id: 1,
  24. body: {
  25. long_num: '5',
  26. long_text: 'foo'
  27. }
  28. )
  29. puts response

Js

  1. const response = await client.indices.create({
  2. index: "my-index-000001",
  3. mappings: {
  4. dynamic_templates: [
  5. {
  6. longs_as_strings: {
  7. match_mapping_type: "string",
  8. match: "long_*",
  9. unmatch: "*_text",
  10. mapping: {
  11. type: "long",
  12. },
  13. },
  14. },
  15. ],
  16. },
  17. });
  18. console.log(response);
  19. const response1 = await client.index({
  20. index: "my-index-000001",
  21. id: 1,
  22. document: {
  23. long_num: "5",
  24. long_text: "foo",
  25. },
  26. });
  27. console.log(response1);

Console

  1. PUT my-index-000001
  2. {
  3. "mappings": {
  4. "dynamic_templates": [
  5. {
  6. "longs_as_strings": {
  7. "match_mapping_type": "string",
  8. "match": "long_*",
  9. "unmatch": "*_text",
  10. "mapping": {
  11. "type": "long"
  12. }
  13. }
  14. }
  15. ]
  16. }
  17. }
  18. PUT my-index-000001/_doc/1
  19. {
  20. "long_num": "5",
  21. "long_text": "foo"
  22. }
long_numフィールドはlongとしてマッピングされます。
long_textフィールドはデフォルトのstringマッピングを使用します。
  1. 次の例は、`````ip_`````で始まるか`````_ip`````で終わるすべてのフィールドをマッチさせ、`````one`````で始まるか`````two`````で終わるフィールドを除外し、`````ip`````フィールドとしてマッピングします:
  2. #### Python
  3. ``````python
  4. resp = client.indices.create(
  5. index="my-index-000001",
  6. mappings={
  7. "dynamic_templates": [
  8. {
  9. "ip_fields": {
  10. "match": [
  11. "ip_*",
  12. "*_ip"
  13. ],
  14. "unmatch": [
  15. "one*",
  16. "*two"
  17. ],
  18. "mapping": {
  19. "type": "ip"
  20. }
  21. }
  22. }
  23. ]
  24. },
  25. )
  26. print(resp)
  27. resp1 = client.index(
  28. index="my-index",
  29. id="1",
  30. document={
  31. "one_ip": "will not match",
  32. "ip_two": "will not match",
  33. "three_ip": "12.12.12.12",
  34. "ip_four": "13.13.13.13"
  35. },
  36. )
  37. print(resp1)
  38. `

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000001',
  3. body: {
  4. mappings: {
  5. dynamic_templates: [
  6. {
  7. ip_fields: {
  8. match: [
  9. 'ip_*',
  10. '*_ip'
  11. ],
  12. unmatch: [
  13. 'one*',
  14. '*two'
  15. ],
  16. mapping: {
  17. type: 'ip'
  18. }
  19. }
  20. }
  21. ]
  22. }
  23. }
  24. )
  25. puts response
  26. response = client.index(
  27. index: 'my-index',
  28. id: 1,
  29. body: {
  30. one_ip: 'will not match',
  31. ip_two: 'will not match',
  32. three_ip: '12.12.12.12',
  33. ip_four: '13.13.13.13'
  34. }
  35. )
  36. puts response

Js

  1. const response = await client.indices.create({
  2. index: "my-index-000001",
  3. mappings: {
  4. dynamic_templates: [
  5. {
  6. ip_fields: {
  7. match: ["ip_*", "*_ip"],
  8. unmatch: ["one*", "*two"],
  9. mapping: {
  10. type: "ip",
  11. },
  12. },
  13. },
  14. ],
  15. },
  16. });
  17. console.log(response);
  18. const response1 = await client.index({
  19. index: "my-index",
  20. id: 1,
  21. document: {
  22. one_ip: "will not match",
  23. ip_two: "will not match",
  24. three_ip: "12.12.12.12",
  25. ip_four: "13.13.13.13",
  26. },
  27. });
  28. console.log(response1);

Console

  1. PUT my-index-000001
  2. {
  3. "mappings": {
  4. "dynamic_templates": [
  5. {
  6. "ip_fields": {
  7. "match": ["ip_*", "*_ip"],
  8. "unmatch": ["one*", "*two"],
  9. "mapping": {
  10. "type": "ip"
  11. }
  12. }
  13. }
  14. ]
  15. }
  16. }
  17. PUT my-index/_doc/1
  18. {
  19. "one_ip": "will not match",
  20. "ip_two": "will not match",
  21. "three_ip": "12.12.12.12",
  22. "ip_four": "13.13.13.13"
  23. }
one_ipフィールドはマッチしないため、textのデフォルトマッピングを使用します。
ip_twoフィールドはマッチしないため、textのデフォルトマッピングを使用します。
three_ipフィールドはip型としてマッピングされます。
ip_fourフィールドはip型としてマッピングされます。

path_matchとpath_unmatch

  1. この例では、`````name`````オブジェクト内のフィールドの値をトップレベルの`````full_name`````フィールドにコピーしますが、`````middle`````フィールドは除外されます:
  2. #### Python
  3. ``````python
  4. resp = client.indices.create(
  5. index="my-index-000001",
  6. mappings={
  7. "dynamic_templates": [
  8. {
  9. "full_name": {
  10. "path_match": "name.*",
  11. "path_unmatch": "*.middle",
  12. "mapping": {
  13. "type": "text",
  14. "copy_to": "full_name"
  15. }
  16. }
  17. }
  18. ]
  19. },
  20. )
  21. print(resp)
  22. resp1 = client.index(
  23. index="my-index-000001",
  24. id="1",
  25. document={
  26. "name": {
  27. "first": "John",
  28. "middle": "Winston",
  29. "last": "Lennon"
  30. }
  31. },
  32. )
  33. print(resp1)
  34. `

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000001',
  3. body: {
  4. mappings: {
  5. dynamic_templates: [
  6. {
  7. full_name: {
  8. path_match: 'name.*',
  9. path_unmatch: '*.middle',
  10. mapping: {
  11. type: 'text',
  12. copy_to: 'full_name'
  13. }
  14. }
  15. }
  16. ]
  17. }
  18. }
  19. )
  20. puts response
  21. response = client.index(
  22. index: 'my-index-000001',
  23. id: 1,
  24. body: {
  25. name: {
  26. first: 'John',
  27. middle: 'Winston',
  28. last: 'Lennon'
  29. }
  30. }
  31. )
  32. puts response

Js

  1. const response = await client.indices.create({
  2. index: "my-index-000001",
  3. mappings: {
  4. dynamic_templates: [
  5. {
  6. full_name: {
  7. path_match: "name.*",
  8. path_unmatch: "*.middle",
  9. mapping: {
  10. type: "text",
  11. copy_to: "full_name",
  12. },
  13. },
  14. },
  15. ],
  16. },
  17. });
  18. console.log(response);
  19. const response1 = await client.index({
  20. index: "my-index-000001",
  21. id: 1,
  22. document: {
  23. name: {
  24. first: "John",
  25. middle: "Winston",
  26. last: "Lennon",
  27. },
  28. },
  29. });
  30. console.log(response1);

Console

  1. PUT my-index-000001
  2. {
  3. "mappings": {
  4. "dynamic_templates": [
  5. {
  6. "full_name": {
  7. "path_match": "name.*",
  8. "path_unmatch": "*.middle",
  9. "mapping": {
  10. "type": "text",
  11. "copy_to": "full_name"
  12. }
  13. }
  14. }
  15. ]
  16. }
  17. }
  18. PUT my-index-000001/_doc/1
  19. {
  20. "name": {
  21. "first": "John",
  22. "middle": "Winston",
  23. "last": "Lennon"
  24. }
  25. }

次の例では、path_matchpath_unmatchの両方にパターンの配列を使用します。

  1. #### Python
  2. ``````python
  3. resp = client.indices.create(
  4. index="my-index-000001",
  5. mappings={
  6. "dynamic_templates": [
  7. {
  8. "full_name": {
  9. "path_match": [
  10. "name.*",
  11. "user.name.*"
  12. ],
  13. "path_unmatch": [
  14. "*.middle",
  15. "*.midinitial"
  16. ],
  17. "mapping": {
  18. "type": "text",
  19. "copy_to": "full_name"
  20. }
  21. }
  22. }
  23. ]
  24. },
  25. )
  26. print(resp)
  27. resp1 = client.index(
  28. index="my-index-000001",
  29. id="1",
  30. document={
  31. "name": {
  32. "first": "John",
  33. "middle": "Winston",
  34. "last": "Lennon"
  35. }
  36. },
  37. )
  38. print(resp1)
  39. resp2 = client.index(
  40. index="my-index-000001",
  41. id="2",
  42. document={
  43. "user": {
  44. "name": {
  45. "first": "Jane",
  46. "midinitial": "M",
  47. "last": "Salazar"
  48. }
  49. }
  50. },
  51. )
  52. print(resp2)
  53. `

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000001',
  3. body: {
  4. mappings: {
  5. dynamic_templates: [
  6. {
  7. full_name: {
  8. path_match: [
  9. 'name.*',
  10. 'user.name.*'
  11. ],
  12. path_unmatch: [
  13. '*.middle',
  14. '*.midinitial'
  15. ],
  16. mapping: {
  17. type: 'text',
  18. copy_to: 'full_name'
  19. }
  20. }
  21. }
  22. ]
  23. }
  24. }
  25. )
  26. puts response
  27. response = client.index(
  28. index: 'my-index-000001',
  29. id: 1,
  30. body: {
  31. name: {
  32. first: 'John',
  33. middle: 'Winston',
  34. last: 'Lennon'
  35. }
  36. }
  37. )
  38. puts response
  39. response = client.index(
  40. index: 'my-index-000001',
  41. id: 2,
  42. body: {
  43. user: {
  44. name: {
  45. first: 'Jane',
  46. midinitial: 'M',
  47. last: 'Salazar'
  48. }
  49. }
  50. }
  51. )
  52. puts response

Js

  1. const response = await client.indices.create({
  2. index: "my-index-000001",
  3. mappings: {
  4. dynamic_templates: [
  5. {
  6. full_name: {
  7. path_match: ["name.*", "user.name.*"],
  8. path_unmatch: ["*.middle", "*.midinitial"],
  9. mapping: {
  10. type: "text",
  11. copy_to: "full_name",
  12. },
  13. },
  14. },
  15. ],
  16. },
  17. });
  18. console.log(response);
  19. const response1 = await client.index({
  20. index: "my-index-000001",
  21. id: 1,
  22. document: {
  23. name: {
  24. first: "John",
  25. middle: "Winston",
  26. last: "Lennon",
  27. },
  28. },
  29. });
  30. console.log(response1);
  31. const response2 = await client.index({
  32. index: "my-index-000001",
  33. id: 2,
  34. document: {
  35. user: {
  36. name: {
  37. first: "Jane",
  38. midinitial: "M",
  39. last: "Salazar",
  40. },
  41. },
  42. },
  43. });
  44. console.log(response2);

Console

  1. PUT my-index-000001
  2. {
  3. "mappings": {
  4. "dynamic_templates": [
  5. {
  6. "full_name": {
  7. "path_match": ["name.*", "user.name.*"],
  8. "path_unmatch": ["*.middle", "*.midinitial"],
  9. "mapping": {
  10. "type": "text",
  11. "copy_to": "full_name"
  12. }
  13. }
  14. }
  15. ]
  16. }
  17. }
  18. PUT my-index-000001/_doc/1
  19. {
  20. "name": {
  21. "first": "John",
  22. "middle": "Winston",
  23. "last": "Lennon"
  24. }
  25. }
  26. PUT my-index-000001/_doc/2
  27. {
  28. "user": {
  29. "name": {
  30. "first": "Jane",
  31. "midinitial": "M",
  32. "last": "Salazar"
  33. }
  34. }
  35. }
  1. #### Python
  2. ``````python
  3. resp = client.index(
  4. index="my-index-000001",
  5. id="2",
  6. document={
  7. "name": {
  8. "first": "Paul",
  9. "last": "McCartney",
  10. "title": {
  11. "value": "Sir",
  12. "category": "order of chivalry"
  13. }
  14. }
  15. },
  16. )
  17. print(resp)
  18. `

Ruby

  1. response = client.index(
  2. index: 'my-index-000001',
  3. id: 2,
  4. body: {
  5. name: {
  6. first: 'Paul',
  7. last: 'McCartney',
  8. title: {
  9. value: 'Sir',
  10. category: 'order of chivalry'
  11. }
  12. }
  13. }
  14. )
  15. puts response

Js

  1. const response = await client.index({
  2. index: "my-index-000001",
  3. id: 2,
  4. document: {
  5. name: {
  6. first: "Paul",
  7. last: "McCartney",
  8. title: {
  9. value: "Sir",
  10. category: "order of chivalry",
  11. },
  12. },
  13. },
  14. });
  15. console.log(response);

Console

  1. PUT my-index-000001/_doc/2
  2. {
  3. "name": {
  4. "first": "Paul",
  5. "last": "McCartney",
  6. "title": {
  7. "value": "Sir",
  8. "category": "order of chivalry"
  9. }
  10. }
  11. }

テンプレート変数

  1. #### Python
  2. ``````python
  3. resp = client.indices.create(
  4. index="my-index-000001",
  5. mappings={
  6. "dynamic_templates": [
  7. {
  8. "named_analyzers": {
  9. "match_mapping_type": "string",
  10. "match": "*",
  11. "mapping": {
  12. "type": "text",
  13. "analyzer": "{name}"
  14. }
  15. }
  16. },
  17. {
  18. "no_doc_values": {
  19. "match_mapping_type": "*",
  20. "mapping": {
  21. "type": "{dynamic_type}",
  22. "doc_values": False
  23. }
  24. }
  25. }
  26. ]
  27. },
  28. )
  29. print(resp)
  30. resp1 = client.index(
  31. index="my-index-000001",
  32. id="1",
  33. document={
  34. "english": "Some English text",
  35. "count": 5
  36. },
  37. )
  38. print(resp1)
  39. `

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000001',
  3. body: {
  4. mappings: {
  5. dynamic_templates: [
  6. {
  7. named_analyzers: {
  8. match_mapping_type: 'string',
  9. match: '*',
  10. mapping: {
  11. type: 'text',
  12. analyzer: '{name}'
  13. }
  14. }
  15. },
  16. {
  17. no_doc_values: {
  18. match_mapping_type: '*',
  19. mapping: {
  20. type: '{dynamic_type}',
  21. doc_values: false
  22. }
  23. }
  24. }
  25. ]
  26. }
  27. }
  28. )
  29. puts response
  30. response = client.index(
  31. index: 'my-index-000001',
  32. id: 1,
  33. body: {
  34. english: 'Some English text',
  35. count: 5
  36. }
  37. )
  38. puts response

Js

  1. const response = await client.indices.create({
  2. index: "my-index-000001",
  3. mappings: {
  4. dynamic_templates: [
  5. {
  6. named_analyzers: {
  7. match_mapping_type: "string",
  8. match: "*",
  9. mapping: {
  10. type: "text",
  11. analyzer: "{name}",
  12. },
  13. },
  14. },
  15. {
  16. no_doc_values: {
  17. match_mapping_type: "*",
  18. mapping: {
  19. type: "{dynamic_type}",
  20. doc_values: false,
  21. },
  22. },
  23. },
  24. ],
  25. },
  26. });
  27. console.log(response);
  28. const response1 = await client.index({
  29. index: "my-index-000001",
  30. id: 1,
  31. document: {
  32. english: "Some English text",
  33. count: 5,
  34. },
  35. });
  36. console.log(response1);

Console

  1. PUT my-index-000001
  2. {
  3. "mappings": {
  4. "dynamic_templates": [
  5. {
  6. "named_analyzers": {
  7. "match_mapping_type": "string",
  8. "match": "*",
  9. "mapping": {
  10. "type": "text",
  11. "analyzer": "{name}"
  12. }
  13. }
  14. },
  15. {
  16. "no_doc_values": {
  17. "match_mapping_type":"*",
  18. "mapping": {
  19. "type": "{dynamic_type}",
  20. "doc_values": false
  21. }
  22. }
  23. }
  24. ]
  25. }
  26. }
  27. PUT my-index-000001/_doc/1
  28. {
  29. "english": "Some English text",
  30. "count": 5
  31. }
englishフィールドはstringフィールドとしてenglishアナライザーを使用してマッピングされます。
countフィールドはlongフィールドとしてdoc_valuesが無効になっています。

動的テンプレートの例

ここに、潜在的に有用な動的テンプレートのいくつかの例があります:

構造化検索

  1. #### Python
  2. ``````python
  3. resp = client.indices.create(
  4. index="my-index-000001",
  5. mappings={
  6. "dynamic_templates": [
  7. {
  8. "strings_as_keywords": {
  9. "match_mapping_type": "string",
  10. "mapping": {
  11. "type": "keyword"
  12. }
  13. }
  14. }
  15. ]
  16. },
  17. )
  18. print(resp)
  19. `

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000001',
  3. body: {
  4. mappings: {
  5. dynamic_templates: [
  6. {
  7. strings_as_keywords: {
  8. match_mapping_type: 'string',
  9. mapping: {
  10. type: 'keyword'
  11. }
  12. }
  13. }
  14. ]
  15. }
  16. }
  17. )
  18. puts response

Js

  1. const response = await client.indices.create({
  2. index: "my-index-000001",
  3. mappings: {
  4. dynamic_templates: [
  5. {
  6. strings_as_keywords: {
  7. match_mapping_type: "string",
  8. mapping: {
  9. type: "keyword",
  10. },
  11. },
  12. },
  13. ],
  14. },
  15. });
  16. console.log(response);

Console

  1. PUT my-index-000001
  2. {
  3. "mappings": {
  4. "dynamic_templates": [
  5. {
  6. "strings_as_keywords": {
  7. "match_mapping_type": "string",
  8. "mapping": {
  9. "type": "keyword"
  10. }
  11. }
  12. }
  13. ]
  14. }
  15. }

文字列のためのテキストのみのマッピング

前の例とは対照的に、文字列フィールドの全文検索にのみ関心があり、集計、ソート、または正確な検索を実行する予定がない場合、Elasticsearchに文字列をtextとしてマッピングするように指示できます:

Python

  1. resp = client.indices.create(
  2. index="my-index-000001",
  3. mappings={
  4. "dynamic_templates": [
  5. {
  6. "strings_as_text": {
  7. "match_mapping_type": "string",
  8. "mapping": {
  9. "type": "text"
  10. }
  11. }
  12. }
  13. ]
  14. },
  15. )
  16. print(resp)

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000001',
  3. body: {
  4. mappings: {
  5. dynamic_templates: [
  6. {
  7. strings_as_text: {
  8. match_mapping_type: 'string',
  9. mapping: {
  10. type: 'text'
  11. }
  12. }
  13. }
  14. ]
  15. }
  16. }
  17. )
  18. puts response

Js

  1. const response = await client.indices.create({
  2. index: "my-index-000001",
  3. mappings: {
  4. dynamic_templates: [
  5. {
  6. strings_as_text: {
  7. match_mapping_type: "string",
  8. mapping: {
  9. type: "text",
  10. },
  11. },
  12. },
  13. ],
  14. },
  15. });
  16. console.log(response);

Console

  1. PUT my-index-000001
  2. {
  3. "mappings": {
  4. "dynamic_templates": [
  5. {
  6. "strings_as_text": {
  7. "match_mapping_type": "string",
  8. "mapping": {
  9. "type": "text"
  10. }
  11. }
  12. }
  13. ]
  14. }
  15. }

また、動的テンプレートを作成して、文字列フィールドをマッピングのランタイムセクションでkeywordフィールドとしてマッピングすることもできます。Elasticsearchがstring型の新しいフィールドを検出すると、それらのフィールドはkeyword型のランタイムフィールドとして作成されます。

  1. たとえば、次のリクエストは、`````string`````フィールドを`````keyword`````型のランタイムフィールドとしてマッピングするための動的テンプレートを作成します。`````runtime`````定義は空ですが、新しい`````string`````フィールドは、Elasticsearchがマッピングにフィールドタイプを追加するために使用する[動的マッピングルール](56049773a26d4fae.md#dynamic-field-mapping-types)に基づいて`````keyword`````ランタイムフィールドとしてマッピングされます。日付検出または数値検出を通過しない`````string`````は、自動的に`````keyword`````としてマッピングされます:
  2. #### Python
  3. ``````python
  4. resp = client.indices.create(
  5. index="my-index-000001",
  6. mappings={
  7. "dynamic_templates": [
  8. {
  9. "strings_as_keywords": {
  10. "match_mapping_type": "string",
  11. "runtime": {}
  12. }
  13. }
  14. ]
  15. },
  16. )
  17. print(resp)
  18. `

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000001',
  3. body: {
  4. mappings: {
  5. dynamic_templates: [
  6. {
  7. strings_as_keywords: {
  8. match_mapping_type: 'string',
  9. runtime: {}
  10. }
  11. }
  12. ]
  13. }
  14. }
  15. )
  16. puts response

Js

  1. const response = await client.indices.create({
  2. index: "my-index-000001",
  3. mappings: {
  4. dynamic_templates: [
  5. {
  6. strings_as_keywords: {
  7. match_mapping_type: "string",
  8. runtime: {},
  9. },
  10. },
  11. ],
  12. },
  13. });
  14. console.log(response);

Console

  1. PUT my-index-000001
  2. {
  3. "mappings": {
  4. "dynamic_templates": [
  5. {
  6. "strings_as_keywords": {
  7. "match_mapping_type": "string",
  8. "runtime": {}
  9. }
  10. }
  11. ]
  12. }
  13. }

単純なドキュメントをインデックスします:

Python

  1. resp = client.index(
  2. index="my-index-000001",
  3. id="1",
  4. document={
  5. "english": "Some English text",
  6. "count": 5
  7. },
  8. )
  9. print(resp)

Ruby

  1. response = client.index(
  2. index: 'my-index-000001',
  3. id: 1,
  4. body: {
  5. english: 'Some English text',
  6. count: 5
  7. }
  8. )
  9. puts response

Js

  1. const response = await client.index({
  2. index: "my-index-000001",
  3. id: 1,
  4. document: {
  5. english: "Some English text",
  6. count: 5,
  7. },
  8. });
  9. console.log(response);

Console

  1. PUT my-index-000001/_doc/1
  2. {
  3. "english": "Some English text",
  4. "count": 5
  5. }

マッピングを表示すると、englishフィールドがkeyword型のランタイムフィールドであることがわかります:

Python

  1. resp = client.indices.get_mapping(
  2. index="my-index-000001",
  3. )
  4. print(resp)

Ruby

  1. response = client.indices.get_mapping(
  2. index: 'my-index-000001'
  3. )
  4. puts response

Js

  1. const response = await client.indices.getMapping({
  2. index: "my-index-000001",
  3. });
  4. console.log(response);

Console

  1. GET my-index-000001/_mapping

Console-Result

  1. {
  2. "my-index-000001" : {
  3. "mappings" : {
  4. "dynamic_templates" : [
  5. {
  6. "strings_as_keywords" : {
  7. "match_mapping_type" : "string",
  8. "runtime" : { }
  9. }
  10. }
  11. ],
  12. "runtime" : {
  13. "english" : {
  14. "type" : "keyword"
  15. }
  16. },
  17. "properties" : {
  18. "count" : {
  19. "type" : "long"
  20. }
  21. }
  22. }
  23. }
  24. }

無効なノルム

ノルムはインデックス時のスコアリング要因です。スコアリングに関心がない場合、たとえばスコアでドキュメントをソートしない場合、これらのスコアリング要因のストレージをインデックスで無効にして、スペースを節約できます。

Python

  1. resp = client.indices.create(
  2. index="my-index-000001",
  3. mappings={
  4. "dynamic_templates": [
  5. {
  6. "strings_as_keywords": {
  7. "match_mapping_type": "string",
  8. "mapping": {
  9. "type": "text",
  10. "norms": False,
  11. "fields": {
  12. "keyword": {
  13. "type": "keyword",
  14. "ignore_above": 256
  15. }
  16. }
  17. }
  18. }
  19. }
  20. ]
  21. },
  22. )
  23. print(resp)

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000001',
  3. body: {
  4. mappings: {
  5. dynamic_templates: [
  6. {
  7. strings_as_keywords: {
  8. match_mapping_type: 'string',
  9. mapping: {
  10. type: 'text',
  11. norms: false,
  12. fields: {
  13. keyword: {
  14. type: 'keyword',
  15. ignore_above: 256
  16. }
  17. }
  18. }
  19. }
  20. }
  21. ]
  22. }
  23. }
  24. )
  25. puts response

Js

  1. const response = await client.indices.create({
  2. index: "my-index-000001",
  3. mappings: {
  4. dynamic_templates: [
  5. {
  6. strings_as_keywords: {
  7. match_mapping_type: "string",
  8. mapping: {
  9. type: "text",
  10. norms: false,
  11. fields: {
  12. keyword: {
  13. type: "keyword",
  14. ignore_above: 256,
  15. },
  16. },
  17. },
  18. },
  19. },
  20. ],
  21. },
  22. });
  23. console.log(response);

Console

  1. PUT my-index-000001
  2. {
  3. "mappings": {
  4. "dynamic_templates": [
  5. {
  6. "strings_as_keywords": {
  7. "match_mapping_type": "string",
  8. "mapping": {
  9. "type": "text",
  10. "norms": false,
  11. "fields": {
  12. "keyword": {
  13. "type": "keyword",
  14. "ignore_above": 256
  15. }
  16. }
  17. }
  18. }
  19. }
  20. ]
  21. }
  22. }

このテンプレートにおけるサブkeywordフィールドは、動的マッピングのデフォルトルールと一貫性を持たせるために表示されます。もちろん、正確な検索や集計をこのフィールドで行う必要がない場合は、前のセクションで説明したように削除できます。

時系列

Elasticsearchで時系列分析を行う場合、集計することが多いがフィルタリングは決して行わない多くの数値フィールドを持つことが一般的です。その場合、ディスクスペースを節約し、インデックス速度を向上させるために、これらのフィールドのインデックスを無効にすることができます:

Python

  1. resp = client.indices.create(
  2. index="my-index-000001",
  3. mappings={
  4. "dynamic_templates": [
  5. {
  6. "unindexed_longs": {
  7. "match_mapping_type": "long",
  8. "mapping": {
  9. "type": "long",
  10. "index": False
  11. }
  12. }
  13. },
  14. {
  15. "unindexed_doubles": {
  16. "match_mapping_type": "double",
  17. "mapping": {
  18. "type": "float",
  19. "index": False
  20. }
  21. }
  22. }
  23. ]
  24. },
  25. )
  26. print(resp)

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000001',
  3. body: {
  4. mappings: {
  5. dynamic_templates: [
  6. {
  7. unindexed_longs: {
  8. match_mapping_type: 'long',
  9. mapping: {
  10. type: 'long',
  11. index: false
  12. }
  13. }
  14. },
  15. {
  16. unindexed_doubles: {
  17. match_mapping_type: 'double',
  18. mapping: {
  19. type: 'float',
  20. index: false
  21. }
  22. }
  23. }
  24. ]
  25. }
  26. }
  27. )
  28. puts response

Js

  1. const response = await client.indices.create({
  2. index: "my-index-000001",
  3. mappings: {
  4. dynamic_templates: [
  5. {
  6. unindexed_longs: {
  7. match_mapping_type: "long",
  8. mapping: {
  9. type: "long",
  10. index: false,
  11. },
  12. },
  13. },
  14. {
  15. unindexed_doubles: {
  16. match_mapping_type: "double",
  17. mapping: {
  18. type: "float",
  19. index: false,
  20. },
  21. },
  22. },
  23. ],
  24. },
  25. });
  26. console.log(response);

Console

  1. PUT my-index-000001
  2. {
  3. "mappings": {
  4. "dynamic_templates": [
  5. {
  6. "unindexed_longs": {
  7. "match_mapping_type": "long",
  8. "mapping": {
  9. "type": "long",
  10. "index": false
  11. }
  12. }
  13. },
  14. {
  15. "unindexed_doubles": {
  16. "match_mapping_type": "double",
  17. "mapping": {
  18. "type": "float",
  19. "index": false
  20. }
  21. }
  22. }
  23. ]
  24. }
  25. }
デフォルトの動的マッピングルールと同様に、ダブルはフロートとしてマッピングされ、通常は十分に正確ですが、ディスクスペースの半分を必要とします。