【Elasticsearch】インデックス設定とマッピングの定義・確認

インデックス設定 (Index-level index settings)インデックス設定とは、個々のインデックスに対する設定です。
マッピングとはマッピングとは、インデックスに保存するフィールドのデータ型の定義です。(データ型一覧)

まずは、結論としてよく利用するコマンドから書きます。

PUT my-index-000001
{
  "settings": {
    "index.number_of_shards":2
  }
}
PUT my-index-000001/_settings
{
  "index.number_of_replicas":3
}
PUT explicit-mapping-test
{
  "mappings": {
    "properties": {
      "field1":    {
        "type": "date",
        "format": "yyyy/MM/dd HH:mm:ssZ"
      }
    }
  }
}
PUT _index_template/test_template
{
  "index_patterns": "test*",
  "template":{
    "settings": {
      "number_of_shards": 2,
      "number_of_replicas": 1
    },
    "mappings": {
      "properties": {
        "field1":    {
          "type": "date",
          "format": "yyyy/MM/dd HH:mm:ssZ"
        }
      }
    } 
  }
}
Elasticsearch & OpenSearch の使い方
学習ロードマップ
スポンサーリンク

インデックス設定 (Index Settings)

インデックス設定では、シャードの数圧縮タイプ更新間隔など様々な設定できます。

インデックス設定には、制約が異なる 2 種類の設定があります。
(新規のインデックス作成に制約はない。既存のインデックスに対してのみ)

インデックス設定説明
Static index settingsインデックスが Close している時のみ、設定を変更可能※
Dynamic index settingsいつでも設定を変更可能
※ただし index.number_of_shards など、一部の設定は close しても変更できない

新規のインデックス作成時に設定

インデックス作成時に Static index settings (index.number_of_shards) を設定してみます。

PUT my-index-000001
{
  "settings": {
    "index.number_of_shards":2
  }
}
GET my-index-000001/_settings
{
  "my-index-000001": {
    "settings": {
      "index": {
        "number_of_shards": "2",

既存のインデックスの設定を変更

既存のインデックスの Dynamic index settings (index.number_of_replicas) を変更してみます

GET /my-index-000001/_settings
        (中略)
        "number_of_replicas" : "1",
PUT my-index-000001/_settings
{
  "index.number_of_replicas":3
}
GET /my-index-000001/_settings
        (中略)
        "number_of_replicas" : "3",

index.number_of_replicas が 3 に変更できています。

スポンサーリンク

マッピングとは

マッピングとはマッピングとは、インデックスに保存するフィールドのデータ型の定義です。(データ型一覧)

マッピングを定義する方法は次の 3 つです。

なお、一度作成したマッピングは変更 (更新) できません。(追加はできます)

マッピングを修正するには、インデックスを作成し直す必要があります。

Dynamic mapping

Dynamic mappingは、ドキュメントを追加する時に、自動でマッピングします。
PUT dynamic-mapping-test/_doc/1
{
  "field1":"2020/11/01 09:00:00+0900"
}
GET dynamic-mapping-test/_mapping
{
  "dynamic-mapping-test": {
    "mappings": {
      "properties": {
        "field1": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword"

結果を見ると、次のマッピングが定義されていることがわかります。

フィールドのキーマッピングしたデータ型
field1text
field1.keywordkeyword
text = 全文検索用、keyword = 完全一致検索用

自分でデータ型を指定したい場合は、手動でマッピングを作成します。

Explicit-mapping

Explicit-mappingは、インデックス作成時に手動でマッピングを定義します。

新規のマッピングを作成

PUT explicit-mapping-test
{
  "mappings": {
    "properties": {
      "field1":    {
        "type": "date",
        "format": "yyyy/MM/dd HH:mm:ssZ"
      }
    }
  }
}
GET explicit-mapping-test/_mapping
{
  "explicit-mapping-test": {
    "mappings": {
      "properties": {
        "field1": {
          "type": "date",
          "format": "yyyy/MM/dd HH:mm:ssZ"

field1 キーが date 型でマッピングされていることがわかります。

マッピングで指定したフォーマットと異なるドキュメントを作成するとどうなる?

マッピングで指定したフォーマットと異なるドキュメントを作成するにエラーとなります。

試しに設定したフォーマットと異なるフォーマットでドキュメントを作成します。

  • 設定したフォーマット = yyyy/MM/dd HH:mm:ssZ
  • 検証するフォーマット = yyyy/MM/dd HH:mm:Z
PUT explicit-mapping-test/_doc/1
{
  "field1":"2020/11/01 09:00+0900"
}
      "reason" : "failed to parse date field [2020/11/01 09:00+0900] with format [yyyy/MM/dd HH:mm:ssZ]",

設定したフォーマットと異なるので、パースエラーが発生します。

次にマッピングで指定したフォーマットに従ってドキュメントを作成

PUT explicit-mapping-test/_doc/1
{
  "field1":"2020/11/01 09:00:00+0900"
}

ドキュメントの作成に成功しました。

既存のマッピングに追加

PUT explicit-mapping-test/_mapping
{
  "properties":{
    "additional_field":{
      "type":"text"
    }
  }
}
GET explicit-mapping-test/_mapping
{
  "explicit-mapping-test": {
    "mappings": {
      "properties": {
        "additional_field": {
          "type": "text"
        },
        "field1": {
          "type": "date",
          "format": "yyyy/MM/dd HH:mm:ssZ"

text 型の additional_field フィールドが追加されました。

スポンサーリンク

インデックステンプレート

インデックステンプレートインデックステンプレートは、インデックス作成前に設定やマッピングを定義する方法です。

インデックステンプレートは、複数のインデックスに同じ設定やマッピングをする際に便利です。

インデックステンプレートを作成

PUT _index_template/test_template
{
  "index_patterns": "test*",
  "template":{
    "mappings": {
      "properties": {
        "field1":    {
          "type": "date",
          "format": "yyyy/MM/dd HH:mm:ssZ"
        }
      }
    } 
  }
}

インデックステンプレートにインデックス設定も含める場合

PUT _index_template/test_template
{
  "index_patterns": "test*",
  "template":{
    "settings": {
      "number_of_shards": 2,
      "number_of_replicas": 1
    },
    "mappings": {
      "properties": {
        "field1":    {
          "type": "date",
          "format": "yyyy/MM/dd HH:mm:ssZ"
        }
      }
    } 
  }
}

上記のテンプレートでは、"field1" キーを date 型 にマッピングしています。

インデックステンプレートの動作確認

PUT test-template
GET test-template/_mapping
{
  "test-template": {
    "mappings" : {
      "properties" : {
        "date" : {
          "type" : "date",
          "format" : "yyyy/MM/dd HH:mm:ssZ"
        }
      }
    }

テンプレートと同じマッピングでインデックスが作成できました。

関連記事

Elasticsearch & OpenSearch の使い方
学習ロードマップ