動的フィールドマッピング

Elasticsearchがドキュメント内の新しいフィールドを検出すると、デフォルトでそのフィールドをタイプマッピングに動的に追加します。 dynamic パラメータはこの動作を制御します。

dynamic パラメータを true または runtime に設定することで、Elasticsearchに受信したドキュメントに基づいてフィールドを動的に作成するよう明示的に指示できます。動的フィールドマッピングが有効になっている場合、Elasticsearchは以下の表のルールを使用して、各フィールドのデータタイプをマッピングする方法を決定します。

以下の表のフィールドデータタイプは、Elasticsearchが動的に検出する唯一の フィールドデータタイプ です。他のすべてのデータタイプは明示的にマッピングする必要があります。

Elasticsearchデータタイプ
JSONデータタイプ "dynamic":"true" "dynamic":"runtime"
null フィールドは追加されません フィールドは追加されません
true または false boolean boolean
double float double
long long long
object object フィールドは追加されません
array 配列内の最初の非-null 値に依存します 配列内の最初の非-null 値に依存します
string 日付検出 を通過する date date
string 数値検出 を通過する float または long double または long
string date 検出または numeric 検出を通過しない text.keyword サブフィールドを持つ keyword

動的マッピングは、ドキュメントレベルおよび object レベルの両方で無効にできます。 dynamic パラメータを false に設定すると、新しいフィールドが無視され、strict はElasticsearchが未知のフィールドに遭遇した場合にドキュメントを拒否します。

既存のフィールドの dynamic 設定を更新するには、マッピング更新API を使用します。

日付検出 および 数値検出 のための動的フィールドマッピングルールをカスタマイズできます。追加の動的フィールドに適用できるカスタムマッピングルールを定義するには、dynamic_templates を使用します。

日付検出

もし date_detection が有効になっている場合(デフォルト)、新しい文字列フィールドはその内容が dynamic_date_formats に指定された日付パターンのいずれかに一致するかどうかを確認されます。一致が見つかると、対応するフォーマットで新しい date フィールドが追加されます。

dynamic_date_formats のデフォルト値は次のとおりです:

[ "strict_date_optional_time","yyyy/MM/dd HH:mm:ss Z||yyyy/MM/dd Z"]

例えば:

Python

  1. resp = client.index(
  2. index="my-index-000001",
  3. id="1",
  4. document={
  5. "create_date": "2015/09/02"
  6. },
  7. )
  8. print(resp)
  9. resp1 = client.indices.get_mapping(
  10. index="my-index-000001",
  11. )
  12. print(resp1)

Ruby

  1. response = client.index(
  2. index: 'my-index-000001',
  3. id: 1,
  4. body: {
  5. create_date: '2015/09/02'
  6. }
  7. )
  8. puts response
  9. response = client.indices.get_mapping(
  10. index: 'my-index-000001'
  11. )
  12. puts response

Js

  1. const response = await client.index({
  2. index: "my-index-000001",
  3. id: 1,
  4. document: {
  5. create_date: "2015/09/02",
  6. },
  7. });
  8. console.log(response);
  9. const response1 = await client.indices.getMapping({
  10. index: "my-index-000001",
  11. });
  12. console.log(response1);

コンソール

  1. PUT my-index-000001/_doc/1
  2. {
  3. "create_date": "2015/09/02"
  4. }
  5. GET my-index-000001/_mapping
create_date フィールドは date として追加されました。
フィールドは format です:
`````”yyyy/MM/dd HH:mm:ss Z
yyyy/MM/dd Z”`````.

日付検出の無効化

動的日付検出は、date_detectionfalse に設定することで無効にできます:

Python

  1. resp = client.indices.create(
  2. index="my-index-000001",
  3. mappings={
  4. "date_detection": False
  5. },
  6. )
  7. print(resp)
  8. resp1 = client.index(
  9. index="my-index-000001",
  10. id="1",
  11. document={
  12. "create_date": "2015/09/02"
  13. },
  14. )
  15. print(resp1)

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000001',
  3. body: {
  4. mappings: {
  5. date_detection: false
  6. }
  7. }
  8. )
  9. puts response
  10. response = client.index(
  11. index: 'my-index-000001',
  12. id: 1,
  13. body: {
  14. create_date: '2015/09/02'
  15. }
  16. )
  17. puts response

Js

  1. const response = await client.indices.create({
  2. index: "my-index-000001",
  3. mappings: {
  4. date_detection: false,
  5. },
  6. });
  7. console.log(response);
  8. const response1 = await client.index({
  9. index: "my-index-000001",
  10. id: 1,
  11. document: {
  12. create_date: "2015/09/02",
  13. },
  14. });
  15. console.log(response1);

コンソール

  1. PUT my-index-000001
  2. {
  3. "mappings": {
  4. "date_detection": false
  5. }
  6. }
  7. PUT my-index-000001/_doc/1
  8. {
  9. "create_date": "2015/09/02"
  10. }
create_date フィールドは text フィールドとして追加されました。

検出された日付フォーマットのカスタマイズ

また、dynamic_date_formats をカスタマイズして独自の 日付フォーマット をサポートすることができます:

Python

  1. resp = client.indices.create(
  2. index="my-index-000001",
  3. mappings={
  4. "dynamic_date_formats": [
  5. "MM/dd/yyyy"
  6. ]
  7. },
  8. )
  9. print(resp)
  10. resp1 = client.index(
  11. index="my-index-000001",
  12. id="1",
  13. document={
  14. "create_date": "09/25/2015"
  15. },
  16. )
  17. print(resp1)

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000001',
  3. body: {
  4. mappings: {
  5. dynamic_date_formats: [
  6. 'MM/dd/yyyy'
  7. ]
  8. }
  9. }
  10. )
  11. puts response
  12. response = client.index(
  13. index: 'my-index-000001',
  14. id: 1,
  15. body: {
  16. create_date: '09/25/2015'
  17. }
  18. )
  19. puts response

Js

  1. const response = await client.indices.create({
  2. index: "my-index-000001",
  3. mappings: {
  4. dynamic_date_formats: ["MM/dd/yyyy"],
  5. },
  6. });
  7. console.log(response);
  8. const response1 = await client.index({
  9. index: "my-index-000001",
  10. id: 1,
  11. document: {
  12. create_date: "09/25/2015",
  13. },
  14. });
  15. console.log(response1);

コンソール

  1. PUT my-index-000001
  2. {
  3. "mappings": {
  4. "dynamic_date_formats": ["MM/dd/yyyy"]
  5. }
  6. }
  7. PUT my-index-000001/_doc/1
  8. {
  9. "create_date": "09/25/2015"
  10. }

日付パターンの配列を構成することと、|| で区切られた単一の文字列に複数のパターンを構成することには違いがあります。日付パターンの配列を構成すると、マッピングされていない日付フィールドを持つ最初のドキュメントの日付に一致するパターンが、そのフィールドのマッピングを決定します:

Python

  1. resp = client.indices.create(
  2. index="my-index-000001",
  3. mappings={
  4. "dynamic_date_formats": [
  5. "yyyy/MM",
  6. "MM/dd/yyyy"
  7. ]
  8. },
  9. )
  10. print(resp)
  11. resp1 = client.index(
  12. index="my-index-000001",
  13. id="1",
  14. document={
  15. "create_date": "09/25/2015"
  16. },
  17. )
  18. print(resp1)

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000001',
  3. body: {
  4. mappings: {
  5. dynamic_date_formats: [
  6. 'yyyy/MM',
  7. 'MM/dd/yyyy'
  8. ]
  9. }
  10. }
  11. )
  12. puts response
  13. response = client.index(
  14. index: 'my-index-000001',
  15. id: 1,
  16. body: {
  17. create_date: '09/25/2015'
  18. }
  19. )
  20. puts response

Js

  1. const response = await client.indices.create({
  2. index: "my-index-000001",
  3. mappings: {
  4. dynamic_date_formats: ["yyyy/MM", "MM/dd/yyyy"],
  5. },
  6. });
  7. console.log(response);
  8. const response1 = await client.index({
  9. index: "my-index-000001",
  10. id: 1,
  11. document: {
  12. create_date: "09/25/2015",
  13. },
  14. });
  15. console.log(response1);

コンソール

  1. PUT my-index-000001
  2. {
  3. "mappings": {
  4. "dynamic_date_formats": [ "yyyy/MM", "MM/dd/yyyy"]
  5. }
  6. }
  7. PUT my-index-000001/_doc/1
  8. {
  9. "create_date": "09/25/2015"
  10. }

結果のマッピングは次のようになります:

コンソール-結果

  1. {
  2. "my-index-000001": {
  3. "mappings": {
  4. "dynamic_date_formats": [
  5. "yyyy/MM",
  6. "MM/dd/yyyy"
  7. ],
  8. "properties": {
  9. "create_date": {
  10. "type": "date",
  11. "format": "MM/dd/yyyy"
  12. }
  13. }
  14. }
  15. }
  16. }

|| で区切られた単一の文字列に複数のパターンを構成すると、任意の日付フォーマットをサポートするマッピングが生成されます。これにより、異なるフォーマットを使用するドキュメントをインデックスすることができます:

Python

  1. resp = client.indices.create(
  2. index="my-index-000001",
  3. mappings={
  4. "dynamic_date_formats": [
  5. "yyyy/MM||MM/dd/yyyy"
  6. ]
  7. },
  8. )
  9. print(resp)
  10. resp1 = client.index(
  11. index="my-index-000001",
  12. id="1",
  13. document={
  14. "create_date": "09/25/2015"
  15. },
  16. )
  17. print(resp1)

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000001',
  3. body: {
  4. mappings: {
  5. dynamic_date_formats: [
  6. 'yyyy/MM||MM/dd/yyyy'
  7. ]
  8. }
  9. }
  10. )
  11. puts response
  12. response = client.index(
  13. index: 'my-index-000001',
  14. id: 1,
  15. body: {
  16. create_date: '09/25/2015'
  17. }
  18. )
  19. puts response

Js

  1. const response = await client.indices.create({
  2. index: "my-index-000001",
  3. mappings: {
  4. dynamic_date_formats: ["yyyy/MM||MM/dd/yyyy"],
  5. },
  6. });
  7. console.log(response);
  8. const response1 = await client.index({
  9. index: "my-index-000001",
  10. id: 1,
  11. document: {
  12. create_date: "09/25/2015",
  13. },
  14. });
  15. console.log(response1);

コンソール

  1. PUT my-index-000001
  2. {
  3. "mappings": {
  4. "dynamic_date_formats": [ "yyyy/MM||MM/dd/yyyy"]
  5. }
  6. }
  7. PUT my-index-000001/_doc/1
  8. {
  9. "create_date": "09/25/2015"
  10. }

結果のマッピングは次のようになります:

コンソール-結果

  1. {
  2. "my-index-000001": {
  3. "mappings": {
  4. "dynamic_date_formats": [
  5. "yyyy/MM||MM/dd/yyyy"
  6. ],
  7. "properties": {
  8. "create_date": {
  9. "type": "date",
  10. "format": "yyyy/MM||MM/dd/yyyy"
  11. }
  12. }
  13. }
  14. }
  15. }

エポックフォーマット(epoch_millisepoch_second)は、動的日付フォーマットとしてサポートされていません。

数値検出

JSONはネイティブの浮動小数点および整数データタイプをサポートしていますが、一部のアプリケーションや言語では、数値が文字列としてレンダリングされることがあります。通常、正しい解決策はこれらのフィールドを明示的にマッピングすることですが、数値検出(デフォルトでは無効)は自動的にこれを行うために有効にできます:

Python

  1. resp = client.indices.create(
  2. index="my-index-000001",
  3. mappings={
  4. "numeric_detection": True
  5. },
  6. )
  7. print(resp)
  8. resp1 = client.index(
  9. index="my-index-000001",
  10. id="1",
  11. document={
  12. "my_float": "1.0",
  13. "my_integer": "1"
  14. },
  15. )
  16. print(resp1)

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000001',
  3. body: {
  4. mappings: {
  5. numeric_detection: true
  6. }
  7. }
  8. )
  9. puts response
  10. response = client.index(
  11. index: 'my-index-000001',
  12. id: 1,
  13. body: {
  14. my_float: '1.0',
  15. my_integer: '1'
  16. }
  17. )
  18. puts response

Js

  1. const response = await client.indices.create({
  2. index: "my-index-000001",
  3. mappings: {
  4. numeric_detection: true,
  5. },
  6. });
  7. console.log(response);
  8. const response1 = await client.index({
  9. index: "my-index-000001",
  10. id: 1,
  11. document: {
  12. my_float: "1.0",
  13. my_integer: "1",
  14. },
  15. });
  16. console.log(response1);

コンソール

  1. PUT my-index-000001
  2. {
  3. "mappings": {
  4. "numeric_detection": true
  5. }
  6. }
  7. PUT my-index-000001/_doc/1
  8. {
  9. "my_float": "1.0",
  10. "my_integer": "1"
  11. }
my_float フィールドは float フィールドとして追加されます。
my_integer フィールドは long フィールドとして追加されます。