【Elasticsearch 入門2】マッピングとテンプレートの設定/確認

本記事は Elasticsearch 入門記事の第2回「マッピング管理とテンプレート」です。

その他の Elasticsearch の使い方は以下の記事をご覧ください。

  1. 【Elasticsearch 入門1】Elasticsearch とは (概要/できること/検索方法)
  2. 【Elasticsearch 入門2】マッピング管理とテンプレート ←イマココ
  3. 【Elasticsearch 入門3】Analyzer の設定 (日本語検索、トークナイズ)
  4. 【Elasticsearch 入門4】集計・分類 (Aggregations)
  5. 【Elasticsearch 入門5】Dynamic index settings の変更
スポンサーリンク

マッピングとは

マッピングとはマッピングとは、フィールドの格納方法を定義したものです。(データ型の一覧はこちら)

マッピングを作成、追加する方法は以下の4つです。

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

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

自動でマッピングを作成

Elasticsearch は、インデックスにドキュメントを作成する時、自動でマッピングを作成します。

PUT /mapping_test/_doc/1
{
  "date":"2020/11/01 09:00:00+0900"
}
GET /mapping_test
   "mappings" : {
      "properties" : {
        "date" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256

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

フィールドのキーマッピングしたデータ型
datetext
date.keywordkeyword
text = 単語ごとに分けた転置インデックスを持つ全文検索用
keyword = 完全一致検索用

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

手動でマッピングを作成

手動でマッピングで、date キーを date 型にマッピングしてみます。

PUT /mapping_test2
{
  "mappings": {
    "properties": {
      "date":    {
        "type": "date",
        "format": "yyyy/MM/dd HH:mm:ssZ"
      }
    }
  }
}
GET /mapping_test2
    "mappings" : {
      "properties" : {
        "date" : {
          "type" : "date",
          "format" : "yyyy/MM/dd HH:mm:ssZ"

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

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

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

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

  • 設定したフォーマット = yyyy/MM/dd HH:mm:ssZ
  • 検証するフォーマット = yyyy/MM/dd HH:mm:Z
PUT /mapping_test2/_doc/1
{
  "date":"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 /mapping_test2/_doc/2
{
  "date":"2020/11/01 09:00:00+0900"
}

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

既存のマッピングに追加

既存のマッピングに新しいフィールドを追加したい場合は、mapping API を利用します。

mapping_test2 インデックスのマッピングに additional_field フィールドを追加してみます。

GET /mapping_test2
    "mappings" : {
      "properties" : {
        "date" : {
          "type" : "date",
          "format" : "yyyy/MM/dd HH:mm:ssZ"
        }
      }
    }
PUT /mapping_test2/_mapping
{
  "properties":{
    ""additional_field":{
      ""type":"text"
    }
  }
}
GET /mapping_test2
    "mappings" : {
      "properties" : {
        "additional_field" : {
          "type" : "text"
        },
        "date" : {
          "type" : "date",
          "format" : "yyyy/MM/dd HH:mm:ssZ"

additional_field フィールドが追加されています。

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

インデックステンプレートインデックステンプレートとは、インデックスの設定 (マッピングなど) の雛形です。
これにより、今後作成する複数のインデックスでマッピングの設定を使いまわせます。

"test" から始まるインデックス名を対象としたテンプレートを作成します。

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

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

それでは、テンプレートの動作を確認してみます。

PUT /test1
GET /test1
    "mappings" : {
      "properties" : {
        "date" : {
          "type" : "date",
          "format" : "yyyy/MM/dd HH:mm:ssZ"
        }
      }
    }

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

スポンサーリンク

関連情報

関連記事

  1. Elasticsearch とは (概要/できること/検索方法)
  2. マッピング管理とテンプレート
  3. Analyzer の設定 (日本語検索、トークナイズ)
  4. 集計・分類 (Aggregations)
  5. Dynamic index settings の変更
  6. データ構造