こんにちは。
サイオステクノロジーの田川です。
今回は 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_shards | 1 | 1 |
number_of_replicas | 1 | 1 |
refresh_interval | 3600s | 1s |
※端的には、大量のドキュメントがある場合には、shard の数を増やします。
また、耐障害性や高速読み取り性能を向上させたい場合には、replica の数を増やします。
※参考
下記の Elastic 社の公式ページによると、1シャードあたりのサイズを10~50GB程度になるようシャード数を設定した方がいいようです。詳細は、下記のページを参照してください。
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_no | integer | チャンク番号 |
content | text | 本文 |
フィールドタイプは、リレーショナルデータベースでのカラムタイプに相当します。
フィールドタイプの詳細な説明については、下記を参照してください。
補足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インデックスへのドキュメントを登録します。