dynamic

新しいフィールドを含むドキュメントをインデックスすると、Elasticsearchはドキュメントまたはドキュメント内の内部オブジェクトにフィールドを動的に追加します。次のドキュメントは、文字列フィールドusername、オブジェクトフィールドname、およびnameオブジェクトの下にある2つの文字列フィールドを追加します:

Python

  1. resp = client.index(
  2. index="my-index-000001",
  3. id="1",
  4. document={
  5. "username": "johnsmith",
  6. "name": {
  7. "first": "John",
  8. "last": "Smith"
  9. }
  10. },
  11. )
  12. print(resp)
  13. resp1 = client.indices.get_mapping(
  14. index="my-index-000001",
  15. )
  16. print(resp1)

Ruby

  1. response = client.index(
  2. index: 'my-index-000001',
  3. id: 1,
  4. body: {
  5. username: 'johnsmith',
  6. name: {
  7. first: 'John',
  8. last: 'Smith'
  9. }
  10. }
  11. )
  12. puts response
  13. response = client.indices.get_mapping(
  14. index: 'my-index-000001'
  15. )
  16. puts response

Js

  1. const response = await client.index({
  2. index: "my-index-000001",
  3. id: 1,
  4. document: {
  5. username: "johnsmith",
  6. name: {
  7. first: "John",
  8. last: "Smith",
  9. },
  10. },
  11. });
  12. console.log(response);
  13. const response1 = await client.indices.getMapping({
  14. index: "my-index-000001",
  15. });
  16. console.log(response1);

Console

  1. PUT my-index-000001/_doc/1
  2. {
  3. "username": "johnsmith",
  4. "name": {
  5. "first": "John",
  6. "last": "Smith"
  7. }
  8. }
  9. GET my-index-000001/_mapping
nameオブジェクトの下のフィールドをname.firstおよびname.lastとして参照します。
変更を表示するにはマッピングを確認してください。

次のドキュメントは、2つの文字列フィールドemailおよびname.middleを追加します:

Python

  1. resp = client.index(
  2. index="my-index-000001",
  3. id="2",
  4. document={
  5. "username": "marywhite",
  6. "email": "[email protected]",
  7. "name": {
  8. "first": "Mary",
  9. "middle": "Alice",
  10. "last": "White"
  11. }
  12. },
  13. )
  14. print(resp)
  15. resp1 = client.indices.get_mapping(
  16. index="my-index-000001",
  17. )
  18. print(resp1)

Ruby

  1. response = client.index(
  2. index: 'my-index-000001',
  3. id: 2,
  4. body: {
  5. username: 'marywhite',
  6. email: '[email protected]',
  7. name: {
  8. first: 'Mary',
  9. middle: 'Alice',
  10. last: 'White'
  11. }
  12. }
  13. )
  14. puts response
  15. response = client.indices.get_mapping(
  16. index: 'my-index-000001'
  17. )
  18. puts response

Js

  1. const response = await client.index({
  2. index: "my-index-000001",
  3. id: 2,
  4. document: {
  5. username: "marywhite",
  6. email: "[email protected]",
  7. name: {
  8. first: "Mary",
  9. middle: "Alice",
  10. last: "White",
  11. },
  12. },
  13. });
  14. console.log(response);
  15. const response1 = await client.indices.getMapping({
  16. index: "my-index-000001",
  17. });
  18. console.log(response1);

Console

  1. PUT my-index-000001/_doc/2
  2. {
  3. "username": "marywhite",
  4. "email": "[email protected]",
  5. "name": {
  6. "first": "Mary",
  7. "middle": "Alice",
  8. "last": "White"
  9. }
  10. }
  11. GET my-index-000001/_mapping

Setting dynamic on inner objects

内部オブジェクトは、親オブジェクトからdynamic設定を継承します。次の例では、タイプレベルで動的マッピングが無効になっているため、新しいトップレベルフィールドは動的に追加されません。

ただし、user.social_networksオブジェクトは動的マッピングを有効にしているため、この内部オブジェクトにフィールドを追加できます。

Python

  1. resp = client.indices.create(
  2. index="my-index-000001",
  3. mappings={
  4. "dynamic": False,
  5. "properties": {
  6. "user": {
  7. "properties": {
  8. "name": {
  9. "type": "text"
  10. },
  11. "social_networks": {
  12. "dynamic": True,
  13. "properties": {}
  14. }
  15. }
  16. }
  17. }
  18. },
  19. )
  20. print(resp)

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000001',
  3. body: {
  4. mappings: {
  5. dynamic: false,
  6. properties: {
  7. user: {
  8. properties: {
  9. name: {
  10. type: 'text'
  11. },
  12. social_networks: {
  13. dynamic: true,
  14. properties: {}
  15. }
  16. }
  17. }
  18. }
  19. }
  20. }
  21. )
  22. puts response

Js

  1. const response = await client.indices.create({
  2. index: "my-index-000001",
  3. mappings: {
  4. dynamic: false,
  5. properties: {
  6. user: {
  7. properties: {
  8. name: {
  9. type: "text",
  10. },
  11. social_networks: {
  12. dynamic: true,
  13. properties: {},
  14. },
  15. },
  16. },
  17. },
  18. },
  19. });
  20. console.log(response);

Console

  1. PUT my-index-000001
  2. {
  3. "mappings": {
  4. "dynamic": false,
  5. "properties": {
  6. "user": {
  7. "properties": {
  8. "name": {
  9. "type": "text"
  10. },
  11. "social_networks": {
  12. "dynamic": true,
  13. "properties": {}
  14. }
  15. }
  16. }
  17. }
  18. }
  19. }
タイプレベルで動的マッピングを無効にします。
userオブジェクトはタイプレベルの設定を継承します。
この内部オブジェクトの動的マッピングを有効にします。

Parameters for dynamic

dynamicパラメータは、新しいフィールドが動的に追加されるかどうかを制御し、次のパラメータを受け入れます:

true 新しいフィールドがマッピングに追加されます(デフォルト)。
runtime 新しいフィールドがランタイムフィールドとしてマッピングに追加されます。
これらのフィールドはインデックスされず、クエリ時に_sourceから読み込まれます。
false 新しいフィールドは無視されます。これらのフィールドはインデックスされず、検索可能ではありませんが、返されたヒットの_sourceフィールドには表示されます。これらのフィールドはマッピングに追加されず、新しいフィールドは明示的に追加する必要があります。

| strict | 新しいフィールドが検出された場合、例外がスローされ、ドキュメントは拒否されます。新しいフィールドはマッピングに明示的に追加する必要があります。

Behavior when reaching the field limit

dynamictrueまたはruntimeのいずれかに設定すると、index.mapping.total_fields.limitに達するまで動的フィールドが追加されます。デフォルトでは、フィールド制限を超えるドキュメントのインデックスリクエストは失敗しますが、index.mapping.total_fields.ignore_dynamic_beyond_limittrueに設定されている場合を除きます。その場合、無視されたフィールドは_ignoredメタデータフィールドに追加されます。