APIコマンドによるElasticsearchインデックス管理の究極ガイド

この究極のAPIコマンドガイドでElasticsearchのインデックス管理を習得しましょう。`PUT`を使用してカスタムマッピングと設定を含むインデックスを細部にわたって作成する方法、`GET`でその設定と詳細を網羅的に確認する方法、そして`DELETE`を使用して不要なインデックスを安全に削除する方法を学びます。この記事では、実践的な例、ベストプラクティス、および重要な警告を提供し、最適なパフォーマンスとリソース管理のために、Elasticsearch内でのデータのライフサイクルを効果的に制御できるようにします。

36 ビュー

APIコマンドによるElasticsearchインデックス管理の究極ガイド

Elasticsearchは、データをインデックスに整理する強力な分散検索・分析エンジンです。インデックスは基本的に、ドキュメントが保存されている1つ以上の物理シャードを指す論理的な名前空間です。これらのインデックスを効果的に管理することは、健全で、パフォーマンスが高く、スケーラブルなElasticsearchクラスタを維持するための基本となります。

このガイドでは、インデックスのライフサイクル管理に必要なAPIコマンドを紹介し、自信を持ってインデックスの作成、調査、削除を行えるようにします。

効率的なインデックス管理が重要であるのには、いくつかの理由があります。これにより、データの保存方法と検索方法を定義し、シャードやレプリカなどの設定を構成してパフォーマンスを最適化し、古くなったり不要になったデータを削除することでストレージを管理できます。これらのコマンドを習得することは、Elasticsearchの管理者や開発者にとっての基礎スキルであり、データインフラストラクチャが堅牢かつ機敏に保たれることを保証します。

Elasticsearchインデックスの理解

APIコマンドに入る前に、Elasticsearchのインデックスが何であるかを把握することが重要です。簡単に言えば、インデックスはリレーショナルデータベースシステムにおけるデータベースのようなものです。これは、類似した特性を持ち、多くの場合共通の目的を持つドキュメントの集まりです。インデックス内の各ドキュメントにはタイプ(ただし、新しいElasticsearchバージョンでは、単一のインデックスは通常単一のタイプ、多くの場合_docを表します)と一意のIDがあります。インデックスは1つ以上のシャードで構成されており、これらは自己完結型の低レベルのLuceneインデックスです。これらのシャードは複数のノードに分散され、スケーラビリティと耐障害性を提供します。

インデックスの主要なコンポーネントは次のとおりです。
* マッピング (Mappings): インデックス内のドキュメントのスキーマを定義し、フィールド名、データ型(例:textkeyworddateinteger)、およびそれらがどのようにインデックス化されるかを指定します。
* 設定 (Settings): プライマリシャード数、レプリカシャード数、リフレッシュ間隔、分析設定など、さまざまな運用側面を構成します。
* エイリアス (Aliases): 1つ以上のインデックスを指すことができる仮想名であり、アプリケーションが実際の名前を知ることなくインデックスと対話するための柔軟性を提供します。

Elasticsearchインデックスの作成

インデックスの作成は、Elasticsearchにデータを保存するための最初のステップです。デフォルト設定でインデックスを作成することもできますが、より一般的には、データと検索要件に合わせてカスタマイズされたマッピングと設定を定義します。この目的にはPUTメソッドが使用されます。

基本的なインデックスの作成

デフォルト設定でインデックスを作成するには、目的のインデックス名に対してPUTリクエストを発行するだけです。

PUT /my_first_index

作成が成功すると、Elasticsearchは確認応答を返します。

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

これにより、デフォルトでプライマリシャード1つとレプリカシャード1つを持つインデックスが作成され、動的マッピングが有効になります(ドキュメントがインデックス化される際にElasticsearchがフィールドタイプを推論することを意味します)。

カスタムマッピングと設定を持つインデックスの作成

より多くの制御を行うために、フィールドに対して明示的なマッピングを定義し、シャード数やレプリカ数などのインデックス設定を指定できます。これは、検索パフォーマンスの最適化とデータ整合性の確保に不可欠です。

例:カスタムマッピングと設定

ここでは、productsという名前のインデックスを作成し、製品データに特定のフィールドタイプを定義し、プライマリシャード3つとレプリカシャード2つで構成します。

PUT /products
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 2
  },
  "mappings": {
    "properties": {
      "product_id": {
        "type": "keyword"
      },
      "name": {
        "type": "text",
        "fields": {
          "raw": {
            "type": "keyword"
          }
        }
      },
      "description": {
        "type": "text"
      },
      "price": {
        "type": "float"
      },
      "stock": {
        "type": "integer"
      },
      "created_at": {
        "type": "date",
        "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd"
      },
      "available": {
        "type": "boolean"
      }
    }
  }
}
  • settings: インデックスのクラスタレベルの設定を定義します。ここでは、number_of_shardsnumber_of_replicasを設定します。
  • mappings: スキーマ定義を含みます。各フィールドについてpropertiesを定義します。
    • product_id: 正確な一致のためのkeywordタイプ。
    • name: フルテキスト検索のためのtext、正確なソートや集計のための追加のkeywordサブフィールド(name.raw)付き。
    • description: フルテキスト検索のためのtext
    • price: 数値演算のためのfloat
    • stock: 数値演算のためのinteger
    • created_at: 正しい解析を保証するために指定された形式を持つdate
    • available: true/false値のためのboolean

ヒント: マッピングは慎重に計画してください。インデックスが作成されてデータが格納された後、既存のフィールドのデータ型を変更するには、データを再インデックス化しない限り直接行うことはできません。データ型と分析ニーズについては事前に計画してください。

インデックスの詳細と設定の表示

インデックスを作成した後、設定を確認したり、マッピングを検証したり、問題をトラブルシューティングしたりするために、その構成を調べる必要がよくあります。GETコマンドは、インデックスに関する包括的な情報を取得するための主要なツールです。

すべてのインデックス情報の取得

特定のインデックスのすべての設定、マッピング、エイリアス、その他のメタデータを取得するには、インデックス名を指定してGETコマンドを使用します。

GET /products

これにより、次のような詳細情報を含む大きなJSONオブジェクトが返されます。

{
  "products": {
    "aliases": {},
    "mappings": {
      "properties": {
        "available": {
          "type": "boolean"
        },
        "created_at": {
          "type": "date",
          "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd"
        },
        "description": {
          "type": "text"
        },
        "name": {
          "type": "text",
          "fields": {
            "raw": {
              "type": "keyword"
            }
          }
        },
        "price": {
          "type": "float"
        },
        "product_id": {
          "type": "keyword"
        },
        "stock": {
          "type": "integer"
        }
      }
    },
    "settings": {
      "index": {
        "routing": {
          "allocation": {
            "include": {
              "_tier_preference": "data_content"
            }
          }
        },
        "number_of_shards": "3",
        "provided_name": "products",
        "creation_date": "1701234567890",
        "number_of_replicas": "2",
        "uuid": "some_uuid",
        "version": {
          "created": "7170099"
        }
      }
    }
  }
}

特定のインデックス情報の取得

URLに情報を追加することで、インデックス構成の特定の部分のみを取得できます。

  • マッピングのみを取得:
    bash GET /products/_mapping

  • 設定のみを取得:
    bash GET /products/_settings

  • エイリアスのみを取得:
    bash GET /products/_alias

このような集中的な取得は、インデックスの特定の側面にのみ関心がある場合に役立ち、出力をより管理しやすくします。

複数のインデックスの表示

複数のインデックス名にカンマで区切るか、ワイルドカードを使用することでも、複数のインデックスの情報を取得できます。

  • 特定の複数インデックス:
    bash GET /products,my_first_index/_settings

  • 'p'で始まるすべてのインデックス:
    bash GET /p*/_mapping

  • すべてのインデックス(本番環境では注意して使用):
    bash GET /_all # または GET /*

注記: GET /_allまたはGET /*を使用する場合、クラスタに多数のインデックスがある場合、非常に大きな応答になる可能性があるため、準備が必要です。特に本番環境では慎重に使用してください。

Elasticsearchインデックスの削除

インデックスの削除は、それに関連するすべてのドキュメントとメタデータを削除する永続的な操作です。これは通常、ディスク容量を解放したり、古いデータを削除したり、テストインデックスをクリーンアップしたりするために行われます。この重要な操作にはDELETEメソッドが使用されます。

単一インデックスの削除

単一のインデックスを削除するには、DELETEコマンドの後にインデックス名を指定します。

DELETE /my_first_index

正常に削除されると、次が返されます。

{
  "acknowledged": true
}

警告: この操作は元に戻せません。インデックスが削除されると、スナップショットやバックアップがない限り、そのデータは永久に失われます。特に本番環境では、DELETEコマンドを実行する前に、必ずインデックス名を確認してください。

複数インデックスの削除

GETと同様に、カンマ区切りリストで指定するか、ワイルドカードを使用して複数のインデックスを削除できます。

  • 特定の複数インデックスの削除:
    bash DELETE /my_old_index_1,my_old_index_2

  • パターンに一致するすべてのインデックスの削除:
    bash DELETE /logstash-2023-*
    このコマンドは、名前がlogstash-2023-で始まるすべてのインデックスを削除します。

  • すべてのインデックスの削除(極度の注意!):
    bash DELETE /_all # または DELETE /*

    危険! _allまたは*を削除すると、クラスタ内のすべてのインデックスが削除されます。これは極めて破壊的な操作であり、クラスタ全体をワイプすることを明示的に意図しており、堅牢な復旧計画がない限り、本番環境で実行してはいけません。誤ったデータ損失を防ぐために、多く本番クラスタではこの機能を無効にしています。

削除のベストプラクティス

  • 常に検証: 削除する前に、削除するインデックス(またはワイルドカード経由のインデックス群)を調べるためにGETを使用します。これにより、正しいデータを対象としていることを確認できます。
    bash GET /logstash-2023-*
    出力を確認し、それが期待どおりであれば、DELETEに進みます。
  • 権限: DELETEコマンドを実行するユーザーまたはロールが必要な権限を持っていることを確認します。本番環境では、DELETE権限を認可された担当者のみに制限します。
  • スナップショット: 大規模な削除を実行する前、特にデータが重要である場合は、必ずクラスタのスナップショットを取得してください。

比較とライフサイクル管理

これら3つのコマンド(作成のためのPUT、検査のためのGET、削除のためのDELETE)は、手動インデックスライフサイクル管理の基盤を形成します。これらは異なる段階で使用されます。

  • 作成 (PUT): インデックスのライフサイクルの開始時に、その構造と初期構成を定義します。
  • 検査 (GET): インデックスの稼働中に、監視、トラブルシューティング、検証のために使用されます。
  • 削除 (DELETE): インデックスの有用なライフサイクルの終わりに、リソースを再利用し、データ保持ポリシーを管理するために使用されます。

これらのコマンドはアドホックな管理やプログラムによる管理には優れていますが、Elasticsearchは自動化されたインデックスライフサイクル管理(ILM)のための強力な機能も提供します。ILMポリシーを使用すると、年齢、サイズ、またはその他の基準に基づいてインデックスをフェーズ(ホット、ウォーム、コールド、削除)間で自動的に移行させるルールを定義でき、縮小、強制マージ、最終的な削除などの操作も含まれます。大規模なデータ保持や長期的なデータ保持には、DELETEフェーズを自動化するためにILMが推奨されるアプローチです。

結論

APIコマンドによるElasticsearchインデックスの管理は、このプラットフォームに取り組むすべての人にとって不可欠なスキルです。PUTを使用して正確なマッピングと設定でインデックスを作成する方法、GETですべての設定を徹底的に検査する方法、そしてDELETEを使用してそれらを安全に削除する方法を学びました。これらのコマンドを理解し、正しく適用することで、データストレージに対するきめ細かな制御が可能になり、Elasticsearchクラスタが効率的で整理され、パフォーマンスの高い状態に保たれることを保証できます。

マッピングの慎重な計画、削除前の注意深い検証、そして高度で自動化されたライフサイクル管理のためにElasticsearchの組み込み機能(ILMなど)を活用することの重要性を常に覚えておいてください。これらのツールとベストプラクティスにより、Elasticsearchインデックス管理を習得するための十分な準備が整いました。さらに探求するために、高度なマッピングオプション、インデックステンプレート、およびElasticsearchのインデックスライフサイクル管理ポリシーの完全なパワーについて深く掘り下げてください。