ベクトル検索から強力なREST APIまで、Elasticsearchは開発者に最も広範な検索ツールキットを提供します。GitHubのサンプルノートブックにアクセスして新しいことを試してみましょう。また、無料トライアルを始めるか、ローカルでElasticsearchを実行することもできます。
情報検索の関連性と精度を向上させるために埋め込みを使用することは、長年にわたって大幅に増加しています。Elasticsearch などのツールは、密ベクトル、疎ベクトル、セマンティック テキストなどの特殊なフィールド タイプを通じてこのタイプのデータをサポートするように進化してきました。ただし、良好な結果を得るには、利用可能な Elasticsearch フィールド タイプ ( semantic_text 、 dense_vector 、 sparse_vectorに埋め込みを適切にマッピングする方法を理解することが重要です。
この記事では、これらのフィールド タイプ、それぞれのフィールド タイプをいつ使用するか、インデックス作成時とクエリ時の両方で埋め込み生成と使用戦略にどのように関連するかについて説明します。
密ベクトル型
Elasticsearch のdense_vectorフィールド タイプは、ほぼすべての次元が関連する、テキスト、画像、音声などのデータの数値表現である密なベクトルを格納するために使用されます。これらのベクトルは、OpenAI、Cohere、Hugging Face などのプラットフォームによって提供される埋め込みモデルを使用して生成され、他のドキュメントと正確な用語を共有していない場合でも、データの全体的な意味をキャプチャするように設計されています。
Elasticsearch では、使用されるモデルに応じて、密なベクトルは最大 4096 次元を持つことができます。たとえば、all-MiniLM-L6-v2 モデルは 384 次元のベクトルを生成しますが、OpenAI の text-embedding-ada-002 は 1536 次元のベクトルを生成します。
dense_vectorフィールドは、事前に生成されたベクトルの使用、カスタム類似度関数の適用、外部モデルとの統合など、より高度な制御が必要な場合に、この種の埋め込みを格納するためのデフォルトのタイプとして一般的に採用されています。
dense_vector 型をいつ、なぜ使用するのでしょうか?
高密度ベクトルは、文、段落、またはドキュメント全体の間の意味的な類似性を捉えるのに最適です。同じ用語を共有していなくても、テキストの全体的な意味を比較することが目的の場合、非常に効果的です。
密ベクトル フィールドは、OpenAI、Cohere、Hugging Face などのプラットフォームによって提供されるモデルを使用した外部埋め込み生成パイプラインが既にあり、これらのベクトルを手動で保存およびクエリするだけの場合に最適です。このタイプのフィールドは、埋め込みモデルとの高い互換性と、生成およびクエリの完全な柔軟性を提供し、検索中にベクトルがどのように生成、インデックス付け、使用されるかを制御できます。
さらに、ランキングロジックを調整する必要がある場合には、k-NN や script_score などのクエリを使用して、さまざまな形式のセマンティック検索をサポートします。これらの可能性により、高密度ベクトルは、RAG (検索拡張生成)、推奨システム、類似性に基づくパーソナライズされた検索などのアプリケーションに最適です。
最後に、このフィールドでは、 cosineSimilarity 、 dotProduct 、 l2normなどの関数を使用して関連性ロジックをカスタマイズし、ユースケースのニーズに応じてランキングを調整できます。
柔軟性、カスタマイズ性、および上記のような高度なユースケースとの互換性を必要とする人にとって、高密度ベクターは依然として最適なオプションです。
密ベクター型のクエリを使用するにはどうすればいいですか?
dense_vectorとして定義されたフィールドの検索では、k 近傍クエリが使用されます。このクエリは、密なベクトルがクエリ ベクトルに最も近いドキュメントを見つける役割を果たします。以下は、密なベクトル フィールドに k-NN クエリを適用する方法の例です。
k-NN クエリに加えて、ドキュメントのスコアリングをカスタマイズする必要がある場合は、script_score クエリを使用して、 cosineSimilarity、dotProduct、l2normなどのベクトル比較関数と組み合わせて、より制御された方法で関連性を計算することもできます。例を参照してください:
さらに詳しく知りたい場合は、 「Elasticsearch でベクトル検索を設定する方法」の記事を参照することをお勧めします。
スパースベクトル型
sparse_vectorフィールド タイプは、ほとんどの値がゼロで、少数の項のみに重要な重みがある数値表現であるスパース ベクトルを格納するために使用されます。このタイプのベクトルは、SPLADE や ELSER (Elastic Learned Sparse EncodeR) などの用語ベースのモデルで一般的です。
スパースベクトル型をいつ、なぜ使用するのでしょうか?
スパースベクトルは、意味的インテリジェンスを犠牲にすることなく、語彙的により正確な検索が必要な場合に最適です。テキストをトークン/値のペアとして表現し、関連する重みを持つ最も関連性の高い用語のみを強調表示することで、明確さ、制御性、効率性を実現します。
このタイプのフィールドは、テキスト内の相対的な重要度に基づいて各トークンに異なる重みを割り当てる ELSER モデルや SPLADE モデルなどの用語に基づいてベクトルを生成する場合に特に役立ちます。
クエリ内の特定の単語の影響を制御したい場合には、スパースベクター型を使用すると、用語の重みを手動で調整して、結果のランキングを最適化できます。
主な利点としては、ドキュメントが関連性があると判断された理由を明確に理解できるため検索の透明性が高く、また、すべての次元を保存する密なベクトルとは異なり、ゼロ以外の値を持つトークンのみが保存されるためストレージ効率が高くなる点が挙げられます。
さらに、スパース ベクトルはハイブリッド検索戦略の理想的な補完であり、稠密ベクトルと組み合わせて語彙の精度と意味の理解を組み合わせることもできます。
スパースベクトル型のクエリを使用するにはどうすればいいですか?
sparse_vectorクエリを使用すると、トークン/値形式のクエリ ベクトルに基づいてドキュメントを検索できます。以下のクエリの例を参照してください。
トレーニング済みのモデルを使用する場合は、クエリ テキストをスパース ベクトルに自動的に変換する推論エンドポイントを使用できます。
このトピックをさらに詳しく調べるには、 「トレーニング済み ML モデルによるスパース ベクトル埋め込みの理解」を読むことをお勧めします。
セマンティックテキストタイプ
semantic_textフィールド タイプは、Elasticsearch でセマンティック検索を使用する最もシンプルで簡単な方法です。推論エンドポイントを通じて、インデックス作成時とクエリ時の両方で埋め込み生成を自動的に処理します。つまり、ベクトルを手動で生成したり保存したりする手間がかかりません。
セマンティックテキストはいつ、なぜ使用するのでしょうか?
semantic_textフィールドは、最小限の技術的労力で、ベクトルを手動で処理することなく開始したい場合に最適です。このフィールドは、埋め込み生成やベクトル検索マッピングなどの手順を自動化し、セットアップをより速く便利にします。
シンプルさと抽象化を重視する場合は、マッピング、埋め込み生成、および取り込みパイプラインを手動で構成する複雑さが排除されるため、 semantic_text使用を検討する必要があります。推論モデルを選択するだけで、残りの作業は Elasticsearch が処理します。
主な利点としては、インデックス作成とクエリの両方で実行される自動埋め込み生成と、選択した推論モデルをサポートするように事前構成された、すぐに使用できるマッピングが挙げられます。
さらに、このフィールドは長いテキストの自動分割 (テキスト チャンク) をネイティブにサポートしており、大きなテキストをそれぞれ独自の埋め込みを持つ小さな段落に分割できるため、検索の精度が向上します。これにより、特にセマンティック検索の基礎となるエンジニアリングを扱うことなく価値を迅速に提供したいチームにとって、生産性が大幅に向上します。
ただし、 semantic_textスピードとシンプルさを提供しますが、このアプローチにはいくつかの制限があります。Elasticsearch の推論エンドポイントとして利用できる限り、市場標準モデルの使用が可能になります。ただし、 dense_vectorフィールドの場合のように、外部で生成された埋め込みはサポートされません。
ベクトルの生成方法をより細かく制御する必要がある場合、独自の埋め込みを使用する場合、または高度な戦略のために複数のフィールドを組み合わせる必要がある場合は、 dense_vectorフィールドとsparse_vectorフィールドによって、よりカスタマイズされたシナリオやドメイン固有のシナリオに必要な柔軟性が得られます。
セマンティックテキストタイプのクエリの使用方法
semantic_textより前は、埋め込みの種類 (密または疎) に応じて異なるクエリを使用する必要がありました。スパースフィールドにはsparse_vectorクエリが使用されましたが、 dense_vectorフィールドには KNN クエリが必要でした。
セマンティック テキスト タイプでは、セマンティック クエリを使用して検索が実行されます。セマンティック クエリは、クエリ ベクトルを自動的に生成し、それをインデックス付けされたドキュメントの埋め込みと比較します。semantic_textタイプでは、クエリを埋め込むための推論エンドポイントを定義できますが、何も指定されていない場合は、インデックス作成時に使用されたのと同じエンドポイントがクエリに適用されます。
詳細については、 「Elasticsearch の新しい semantic_text マッピング: セマンティック検索の簡素化」という記事を読むことをお勧めします。
まとめ
Elasticsearch で埋め込みをマッピングする方法を選択するときは、ベクトルを生成する方法とベクトルに対して必要な制御レベルを理解することが重要です。シンプルさを求める場合、セマンティック テキスト フィールドを使用すると、自動かつスケーラブルなセマンティック検索が可能になり、多くの初期使用ケースに最適です。より高度な制御、微調整されたパフォーマンス、またはカスタム モデルとの統合が必要な場合は、密ベクトル フィールドと疎ベクトル フィールドが必要な柔軟性を提供します。
理想的なフィールド タイプは、ユース ケース、利用可能なインフラストラクチャ、機械学習スタックの成熟度によって異なります。最も重要なのは、Elastic が最新の、適応性に優れた検索システムを構築するためのツールを提供していることです。




