Elasticsearch へのインデックスの作成

BLOG

こんにちは。
サイオステクノロジーの田川です。

今回は Elasticsearch にインデックスを作成してみたいと思います。

対象者

  • Elastic Cloud のアカウントを持っている人(トライアルライセンスを含む)
  • Elasticsearch の初心者

できるようになること

  • Elastic Cloud のデプロイメント内にインデックスを作成する。
    (インデックスは作成されますが、ドキュメントは、まだ登録しません。)

前提条件

  • Elastic Cloud (version: 8.15.0)
  • Elastic Cloud 上にデプロイメントを作成済

(2024年09月17日時点の情報を元に記載しています。)

1. Elasticsearch のデータ構造

Elasticsearch のデータ構造をかなり大雑把に書くと、次のような構造となります。

クラスター → インデックス → シャード → ドキュメント → フィールド

※参考
Elasticsearch での用語とリレーショナルデータベースでの用語の対応表は、おおよそ下記のようになります。

Elasticsearch での用語リレーショナルデータベースでの用語
デプロイメントデータベース
クラスター(なし)
インデックステーブル
シャード(なし)
ドキュメントレコード
フィールドカラム

※注 Elasticsearhの仕組みとリレーショナルデータベースの仕組みは異なるため、
   完全に上の表に一致するわけではありません。あくまでも、「似たようなもの」です。

前回のデプロイメントの作成で、クラスターまでは設定出来ています。

今回は、インデックス ~ フィールド を作ります。

2. インデックスの作成準備

インデックスを作成する際、シャード数やレプリケーション数を決定しておく必要があります。

レプリケーション数は後から変更することも可能ですが、シャード数はインデックス作成時に決定したものとなります。
(シャード数を変更する方法は皆無ではありませんが、レプリカほど簡単には変更できません。)

ついでに、リフレッシュ間隔も設定しておきます。

この記事ではサンプルデータとして、「桃太郎」を使用します。
今回は、更新がほとんどない少量のサンプルデータで、かつ、高速読み取りも特に不要なので、下表のようにします。

項目設定値ディフォルト値
number_of_shards11
number_of_replicas11
refresh_interval3600s1s

※端的には、大量のドキュメントがある場合には、shard の数を増やします。
 また、耐障害性や高速読み取り性能を向上させたい場合には、replica の数を増やします。

※参考
下記のブログ記事によると、データ量が多くなる場合、
1シャードあたりのサイズを40GB以下程度になるようシャード数を設定した方がいいようです。

Elasticsearchクラスターのシャード数はいくつに設定すべきか?
Elasticsearchは非常に多用途なプラットフォームです。さまざまなユースケースをサポートし、データの編成および複製戦略に関して高い柔軟性を提供します。ただし、この柔軟性があるために難しくなることもあります。それは、データをインデック...

3. Dev Tools

先ほどの設定値を踏まえ、実際に、インデックスを作成します。

そのために、Dev Tools 画面を開きます。

Elastic Cloud へログイン後、前回作成したデプロイメントの Open をクリックします。

そうすると、「Welcome home」と表示された画面へ遷移します。

「Welcome home」画面の右下にある Dev Tools をクリックします。

クリックすると、次の画面(Dev Tools 画面)が表示されます。

(Dev Tools画面への遷移方法は他にもあります。)

初回は、右側の説明画面が表示されますが、[Dismiss] をクリックすることで、
この部分を閉じることができます。

左側のリクエスト欄に GET, POST, PUT, DELETE の Web リクエストを記述することができます。

Web リクエストを記述した後 ▷ をクリックすると、そのリクエストが実行され、結果が右側のレスポンス欄に表示されます。

試しに、ライセンスを確認してみます。

左側の入力欄に

GET _license

と入力し、その行にカーソルを置いた状態で、 ▷ をクリックします。

右側のレスポンス欄に、次のような結果が返却されます。(uidは、伏字にしています。)

{
  "license": {
    "status": "active",
    "uid": "***********************************",
    "type": "enterprise",
    "issue_date": "2023-03-02T00:00:00.000Z",
    "issue_date_in_millis": 1677715200000,
    "expiry_date": "2028-02-29T23:59:59.999Z",
    "expiry_date_in_millis": 1835481599999,
    "max_nodes": null,
    "max_resource_units": 100000,
    "issued_to": "Elastic Cloud",
    "issuer": "API",
    "start_date_in_millis": 1677628800000
  }
}

なお、左側のリクエスト欄に書いたリクエストは、消さない限り、これまでに発行したリクエストが残っています。

頻繁に呼びたいリクエストは、ここに書いておけば、 ▷ をクリックするとすぐにリクエストを再発行できます。

4. インデックスの作成

Dev Tools を使って、インデックスの作成リクエストを発行します。

Dev Tools の左側にリクエスト欄に、次のように入力し、 ▷ をクリックします。
(この後、「桃太郎」の内容を登録する予定なので、作成するインデックス名は、”momotaro” とします。)

PUT /momotaro
{
  "settings": {
    "index": {
      "number_of_shards": 1,
      "number_of_replicas": 1,
      "refresh_interval": "3600s"
    }
  }
}

成功すれば右側のレスポンス欄に、次のような結果が表示されます。

{
  "acknowledged": true,
  "shards_acknowledged": true,
  "index": "momotaro"
}

インデックスが作成されたか、確認してみます。

Dev Tools から下記のリクエストを発行してみます。

GET /momotaro/_settings

成功すると、右側のレスポンス欄に、以下のように出力されます。

{
  "momotaro": {
    "settings": {
      "index": {
        "routing": {
          "allocation": {
            "include": {
              "_tier_preference": "data_content"
            }
          }
        },
        "refresh_interval": "3600s",
        "number_of_shards": "1",
        "provided_name": "momotaro",
        "creation_date": "1726546814052",
        "number_of_replicas": "1",
        "uuid": "*****************",
        "version": {
          "created": "8512000"
        }
      }
    }
  }
}

Elastic Cloud の画面からも確認してみます。
左上の3点メニューをクリックし、プルダウンメニューを表示します。
そこから、Search の Content を選択します。

すると、インデックス一覧画面へ遷移します。

先ほど作成した momotaro が表示されています。
ただし、データはまだ登録していないので、Docs count = 0 となっています。

5. フィールドマッピングの設定

インデックスにデータを格納する前に、フィールドマッピングを設定しておきます。

今回は単純なサンプルデータなので、フィールドは下表のようにします。

フィールド名フィールドタイプ説明
chunk_nointegerチャンク番号
contenttext本文

フィールドタイプは、リレーショナルデータベースでのカラムタイプに相当します。
フィールドタイプの詳細な説明については、下記を参照してください。

Field data types | Elasticsearch Guide [8.15] | Elastic

補足1

文字列型の代表的なフィールドタイプには、text と keyword がありますが、用途が異なります。
今回は、小説内の文章を全文検索したいので、text を利用します。

フィールドタイプ説明
keyword各種コードなど、厳密に一致する文字列を検索するのに使用する。
ソートや集計も可能。
text文章など、あいまい検索に利用する。

補足2

ちょっとだけデータを登録して、軽く確認したい、という程度であれば、
フィールドマッピングを省略してデータを登録しても、Elasticsearch がある程度、自動で設定してくれます。また、Elastic Cloud の管理画面上のGUIを使っても、ある程度、設定可能です。

ただし、細かい設定を行いたい場合は、あらかじめフィールドマッピングを API を使って作成しておいた方がいいと思います。

補足3

Elasticsearch では、フィールドの追加は、比較的容易にできます。
しかし、フィールドの削除は、容易にはできません。
フィールドタイプの変更も、制約があります。


上記を踏まえて、フィールドマッピング用のリクエストを Dev Tools に入力します。

インデックスの一覧画面から Dev Tools の画面を開くには、画面下部の Console をクリックします。

左側のリクエスト欄に次のリクエストを入力し、 ▷ をクリックします。

PUT /momotaro/_mapping
{
  "dynamic": false,
  "properties": {
    "chunk_no": {
      "type": "integer"
    },
    "content": {
      "type": "text"
    }
  }
}

成功したら、右側のレスポンス欄に、下記が表示されます。

{
  "acknowledged": true
}

6.フィールドマッピングの確認

実際にフィールドが作成されたか確認してみます。

まずは、Dev Tools から、下記のリクエストを送信してみます。

GET /momotaro/_mapping

成功すると、右側のレスポンス欄に、以下のように出力されます。

{
  "momotaro": {
    "mappings": {
      "dynamic": "false",
      "properties": {
        "chunk_no": {
          "type": "integer"
        },
        "content": {
          "type": "text"
        }
      }
    }
  }
}

Elastic Cloud の画面からも確認してみます。

インデックス一覧画面から “momotaro” をクリックします。

すると、momotaro インデックスの画面が表示されます。

この画面の “Index mappings” をクリックします。

momotaro インデックスのマッピング情報が表示されます。

chunk_no が Integer 型で、content が Text 型で作成されていることがわかります。
なお、この画面にある [+ Add field] ボタンから、新たにフィールドを追加することも可能です。
ただし、細かい設定を行いたい場合には、API を使って追加することをお薦めします。

次回は、作成したmomotaroインデックスへのドキュメントを登録します。