Elasticsearchのインデックスとは?

info-retrieval-blog-720x420-v2.jpeg

ITの世界では、インデックスという言葉が実にさまざまな意味で使われています。もっとも、開発者に「インデックスとは何ですか?」と聞けば、ほとんどの方が、「一般にはリレーショナルデータベース(RDBMS)の中で使うデータ構造の一種を指し、テーブルに関連付けてデータの取得速度を高めるもの」といったような答えを返してくるのではないでしょうか。

では、Elasticsearch®インデックスとは何でしょうか?Elasticsearchのインデックスは、ドキュメントの集合を保持する論理的な名前空間です。各ドキュメントは複数のフィールドで構成されており、そのフィールドはさらに、データを格納するキーと値のペアになっています。

Elasticsearchのインデックスとリレーショナルデータベースの違い

Elasticsearchのインデックスは、リレーショナルデータベースのインデックスとは異なります。ここで、Elasticsearchクラスターを1件のデータベースだと考えてみましょう。このデータベースには多数のインデックスがあります。インデックスは、それぞれがテーブルに相当します。各インデックスはさらに、内部に多数のドキュメントを格納した構造になっています。

  • RDBMS => データベース => テーブル => 列/行
  • Elasticsearch => クラスター => インデックス => シャード => キーバリューペアから構成されたドキュメント

ElasticsearchはJSONドキュメントを格納しますが、インデックスにインプットする内容は非常に柔軟です。利用可能な多数のインテグレーションBeatsを使用すれば、すぐに使い始めることができます。さらに、取り込みパイプラインLogstash®を使用して、独自のETLプロセスを定義することもできます。それらの多数のプロセッサとプラグインを利用することもできます。

リレーショナルデータベースとのもう一つの違いは、事前のスキーマ定義を必要とせずにデータをインポートできる点です。動的型は、迅速に作業を開始したり、ドキュメント内の予期しないフィールドに対応したりするのに最適な方法です。設定が完了したら、固定スキーマに切り替えることでパフォーマンスを向上させることができます。

ランタイムフィールドも、読み書き時にスキーマを実行できる興味深い特徴です。既存のドキュメントに追加して新しいフィールドを導出することもできますし、クエリ時にランタイムフィールドを作成することもできます。スクリプトを使って計算された値と考え、ドキュメントのソースを読み取ることができます。

Elasticsearchとリレーショナルデータベースの違いを今すぐ見てみましょう。Elastic Cloudのトライアルアカウントなら、今すぐ無料でお試しいただけます。

Elasticsearchの使いやすいAPIを用いたデータ操作

Elasticsearchは、ドキュメントデータを操作するためのRESTfulなJSONベースのAPIを提供します。適切なクラスターエンドポイントにHTTPリクエストを送信することで、ドキュメントのインデックス、検索、更新、削除ができます。これらのCRUDのような操作は、個々の文書レベルでもインデックスレベルでも実行できます。ご希望であれば、直接RESTの代わりに使用できる言語固有のクライアントライブラリもあります。
次の例では、playwrights という名前のインデックスに、document_idが1であるドキュメントを作成します。スキーマや事前の設定は一切不要で、データを挿入するだけで済むことに注目してください。

POST /playwrights/_doc/1
{
  "firstname": "William",
  "lastname": "Shakespeare"
}

ドキュメントやフィールドは、以下のように必要に応じて好きなだけ追加できます。このようなことは、リレーショナルデータベースでは簡単にはできません。

POST /playwrights/_doc/2
{
  "firstname": "Samuel",
  "lastname": "Beckett",
  "year_of_birth": 1906
}

以下はドキュメントを全件取り出すクエリです。検索エンドポイントを使用している点にご注目ください。

GET /playwrights/_search
{
    "query": {
        "match_all": {}
    }
}

誕生年のような要素を使ってクエリを実行することもできます。

GET /playwrights/_search
{
    "query": {
        “match": {
            “year_of_birth": 1906
        }
    }
}

Elasticsearchは基本的なクエリ機能に加えて、ファジーマッチ、ステミング、関連性スコアリング、ハイライト表示、そしてテキストを「トークン」と呼ばれる小さな単位に分割するトークン化といった高度な検索機能を提供しています。ほとんどの場合、これらのトークンは単語単位ですが、さまざまなトークナイザーが存在します。

非正規化データがデータの取得高速化の鍵となる理由

リレーショナルデータベースでは、データの重複を排除し、データの一貫性を確保するために、正規化がよく適用されます。たとえば、顧客、製品、注文のそれぞれに別個のテーブルを設けることがあります。

Elasticsearchでは、正規化を実施しない運用が一般的です。データを多数のテーブルに分割するのではなく、関係のある情報をすべて単体のJSONドキュメントに格納しておくのです。注文のドキュメントには顧客と製品のどちらの情報も格納されます。製品や顧客のインデックスを参照する外部キーを、注文のドキュメントに設定する方法とは対照的です。これこそ、Elasticsearchが検索処理によるデータ取得の速度と効率を高めている秘訣にほかなりません。一般論として、データの結合処理のコンピューティングコストよりも、ストレージの方がコストが少なくて済みます。

Elasticsearchが分散システムでスケーラビリティを実現するしくみ

各インデックスは一意の名前で識別され、1つ以上のシャードに分割されます。シャードはインデックスの小さなサブセットで、Elasticsearch Nodeのクラスター全体で並列処理と分散ストレージが可能です。シャードにはプライマリシャードとレプリカシャードがあります。レプリカはデータの冗長コピーを提供してハードウェア障害から保護し、ドキュメントの検索や取得などの読み取りリクエストを処理するための容量を増やします

クラスターにノードを追加するほど、インデックスや検索の機能が強化されていきます。このようなことをリレーショナルデータベースで実現するのは簡単ではありません。

先ほどの playwrights の例に戻ると、以下を実行することで、Elasticsearchが自動で推測したタイプマッピングと、インデックスに割り当てられたシャードとレプリカの数を確認できます。

GET /playwrights/

Elasticsearchでインデックスできるデータの種類

Elasticsearchは多くの種類のデータをインデックスできます。まずテキストデータをはじめ、数値データや位置情報データも対象です。また、類似検索で使う密ベクトルを格納することもできます。これらをそれぞれ順番に見ていきましょう。

倒置インデックスを使ったテキスト/語彙検索

Elasticsearchは、特定のフィールドタイプに対して最適な基盤となるデータ構造を選択します。たとえば、テキストはトークン化され、その後、倒置インデックスに格納されます。倒置インデックスとは、あらゆるドキュメントに出現する一意のトークンをすべてリスト化し、各単語が出現するすべてのドキュメントを特定する構造のことです。

以下のテーブルは、倒置インデックスの一般的な構成を示しています。「ロンドン」という語句を検索すると、インデックス内の6件のドキュメントに出てくることがわかります。この倒置インデックスによって、テキスト検索を非常に高速に実行できます。

トークン

ドキュメントID

ロンドン

1、3、8、12、23、88

パリ

1、12、88

マドリッド3、8、12
ベルリン12、23

数字検索と位置情報検索による効率的な空間分析

数値データや位置情報データは、BKDツリー(ブロックKDツリーインデックス)に格納されます。BKDツリーは、エンジニアリングアプリケーションで使用されるデータ構造で、多次元データの効率的な空間インデックス作成およびクエリ処理に用いられます。BKDツリーでは、データポイントをブロック単位に整理します。大規模なデータセットを対象とした高速範囲検索や最近傍クエリが可能になるため、空間データの分析や最適化に携わるエンジニアには非常に有益なツールとなっています。

NLPによるベクトル検索/セマンティック検索

ベクトル検索について聞いたことがあるかもしれませんが、ベクトル検索とは一体何なのでしょうか?ベクトル検索エンジンは、ベクトルデータベース、セマンティック検索、またはコサイン検索として知られ、与えられた(ベクトル化された)クエリの最も近い隣接点を見つけます。ベクトルサーチの強さは、上記の逆インデックス例で求められるような、テキストと完全に一致しない類似文書を発見できることです。代わりに、ある程度の類似性を表すベクトルを用います。

関連記事:ベクトル検索とは?

ベクトル検索のよくあるユースケースを以下にいくつか紹介します。

  • 質問に対する回答
  • 以前に答えた質問に対する回答の検索(テキストとしては完全に同じではないものの、質問内容が似ている場合)
  • レコメンデーションの作成(音楽アプリケーションでユーザーの好みに応じてよく似た曲を見つけるなど)

いずれも、類似性を正確に評価し、ターゲットに合った提案を行うために、何万次元にもなるベクトルを活用してデータを包括的に表現しています。

Elasticsearchは、dense_vectorドキュメントタイプと、検索語句をベクトルに変換した後にドキュメント内のベクトルと比較する類似検索の機能を通じて、ベクトル検索をサポートしています。

生成AIをもう少し深く掘り下げたい人のために、人工知能ベースの検索アプリケーションを強化するように設計されたESRE(Elasticsearch Relevance Engine™ )も提供しています。ESREは、開発者に高度な検索アルゴリズム一式と、大規模な言語モデルとの統合機能を提供します。

次のアクション

準備ができたら、ビジネスでデータを活用するための次の3つのステップに進みましょう。

  1. 無料トライアルを開始して、Elastic Cloudがビジネスにどのように役立つかをご確認ください。
  2. Elasticsearch 入門ウェビナーをご覧いただけます。
  3. プロダクトのツアーを参考に、Elasticsearch Platformの仕組みと、当社のソリューションがどのようにお客様のニーズに合うかをご確認ください。

 

2013年2月24日初稿公開、2023年7月17日更新。