メインコンテンツまでスキップ
バージョン: User Guides (Cloud)

全文検索

全文検索は、テキストデータセット内の特定の用語や語句を含むドキュメントを検索し、関連性に基づいて結果をランク付けする機能です。この機能は、正確な用語を見逃す可能性のあるセマンティック検索の限界を克服し、最も正確で文脈的に関連する結果を受け取ることができます。さらに、この機能はベクトル検索を簡素化し、手動でベクトル埋め込みを生成することなく、生のテキスト入力を受け付けることで自動的にテキストデータをスパース埋め込みに変換します。

関連性スコアリングにBM25アルゴリズムを使用することで、この機能は特に検索強化生成(RAG)のシナリオで重要性を増しています。RAGでは、特定の検索語句に強くマッチするドキュメントを優先します。

📘ノート

全文検索をセマンティックベースの密ベクトル検索と統合することで、検索結果の正確性と関連性を向上させることができます。詳細については、ハイブリッド検索を参照してください。

Zilliz Cloud は、プログラムによる全文検索の有効化とウェブコンソールからの有効化の両方をサポートしています。このページでは、プログラムによる全文検索の有効化方法に焦点を当てます。ウェブコンソールでの操作の詳細については、コレクションの管理(コンソール)を参照してください。

概要

全文検索は、手動埋め込みの必要性を排除することでテキストベースの検索プロセスを簡素化します。この機能は以下のワークフローで動作します:

  1. テキスト入力:手動埋め込みの必要なく、生のテキストドキュメントを挿入するかクエリテキストを提供します。

  2. テキスト分析:Zilliz Cloud はアナライザーを使用して入力テキストを個別の検索可能な語句にトークン化します。

  3. 関数処理:組み込み関数はトークン化された語句を受け取り、スパースベクトル表現に変換します。

  4. コレクションストア:Zilliz Cloud はこれらのスパース埋め込みを効率的な検索用にコレクションに保存します。

  5. BM25スコアリング:検索時に、Zilliz Cloud はBM25アルゴリズムを適用して保存されたドキュメントのスコアを計算し、クエリテキストとの関連性に基づいて一致した結果をランク付けします。

DfPMwP6ZahhHlLbIN0gcG9d7nQM

全文検索を使用するには、以下の主要な手順に従います:

  1. コレクションを作成する:必要なフィールドを持つコレクションを設定し、生のテキストをスパース埋め込みに変換する関数を定義します。

  2. データを挿入する:生のテキストドキュメントをコレクションにインジェストします。

  3. 検索を実行する:クエリテキストを使用してコレクション内を検索し、関連する結果を取得します。

全文検索を有効にするには、特定のスキーマを持つコレクションを作成します。このスキーマには以下の3つの必要なフィールドが含まれなければなりません:

  • コレクション内の各エンティティを一意に識別するプライマリフィールド。

  • 生のテキストドキュメントを格納する VARCHAR フィールドで、enable_analyzer 属性が True に設定されています。これにより、Zilliz Cloud は関数処理用にテキストを特定の語句にトークン化できます。

  • VARCHAR フィールド用に Zilliz Cloud が自動的に生成するスパース埋め込みを保存するために予約された SPARSE_FLOAT_VECTOR フィールド。

コレクションスキーマの定義

まず、スキーマを作成し、必要なフィールドを追加します:

from pymilvus import MilvusClient, DataType, Function, FunctionType

client = MilvusClient(
uri="YOUR_CLUSTER_ENDPOINT",
token="YOUR_CLUSTER_TOKEN"
)

schema = client.create_schema()

schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True, auto_id=True)
schema.add_field(field_name="text", datatype=DataType.VARCHAR, max_length=1000, enable_analyzer=True)
schema.add_field(field_name="sparse", datatype=DataType.SPARSE_FLOAT_VECTOR)

この構成では、

  • id:プライマリキーとして機能し、auto_id=True で自動生成されます。
  • text:全文検索操作用の生のテキストデータを格納します。データ型は VARCHAR でなければなりません。VARCHAR は Zilliz Cloud のテキスト保存用文字列データ型です。enable_analyzer=True を設定して、Zilliz Cloud がテキストをトークン化できるようにします。デフォルトでは、Zilliz Cloud はテキスト分析用に standard アナライザー を使用します。別のアナライザーを設定するには、アナライザー概要を参照してください。
  • sparse:全文検索操作用に内部的に生成されたスパース埋め込みを格納するための予約されたベクトルフィールドです。データ型は SPARSE_FLOAT_VECTOR でなければなりません。

次に、テキストをスパースベクトル表現に変換する関数を定義し、スキーマに追加します:

bm25_function = Function(
name="text_bm25_emb", # 関数名
input_field_names=["text"], # 生のテキストデータを含む VARCHAR フィールドの名前
output_field_names=["sparse"], # 生成された埋め込みを格納するための SPARSE_FLOAT_VECTOR フィールドの名前
function_type=FunctionType.BM25, # `BM25` に設定
)

schema.add_function(bm25_function)

パラメータ

説明

name

関数の名前です。この関数は、text フィールドの生のテキストを sparse フィールドに格納される検索可能なベクトルに変換します。

input_field_names

テキストからスパースベクトルへの変換が必要な VARCHAR フィールドの名前です。FunctionType.BM25 の場合、このパラメータは1つのフィールド名のみ受け入れます。

output_field_names

内部的に生成されたスパースベクトルが格納されるフィールドの名前です。FunctionType.BM25 の場合、このパラメータは1つのフィールド名のみ受け入れます。

function_type

使用する関数のタイプです。FunctionType.BM25 に設定します。

📘ノート

複数の VARCHAR フィールドを持つコレクションでテキストからスパースベクトルへの変換が必要な場合は、コレクションスキーマに個別の関数を追加し、各関数が一意の名前と output_field_names 値を持つようにします。

インデックスの設定

必要なフィールドと組み込み関数でスキーマを定義した後、コレクションのインデックスを設定します。このプロセスを簡素化するため、index_type として AUTOINDEX を使用します。これは Zilliz Cloud がデータの構造に基づいて最も適切なインデックスタイプを選択・設定できるオプションです。

index_params = client.prepare_index_params()

index_params.add_index(
field_name="sparse",

index_type="AUTOINDEX",
metric_type="BM25"

)

パラメータ

説明

field_name

インデックスを作成するベクトルフィールドの名前です。全文検索では、これは生成されたスパースベクトルを格納するフィールドでなければなりません。この例では、sparse に設定します。

index_type

作成するインデックスタイプです。AUTOINDEX は Zilliz Cloud が自動的にインデックス設定を最適化できるようにします。インデックス設定により多くの制御が必要な場合は、Zilliz Cloud でスパースベクトルで利用可能なさまざまなインデックスタイプから選択できます。

metric_type

このパラメータの値は、全文検索機能のために BM25 に設定しなければなりません。

params

インデックスに特有の追加パラメータの辞書です。

params.inverted_index_algo

インデックスの構築とクエリに使用されるアルゴリズムです。有効な値:

  • "DAAT_MAXSCORE"(デフォルト):MaxScoreアルゴリズムを使用した最適化されたDocument-at-a-Time(DAAT)クエリ処理。MaxScoreは、影響が最小になりそうな語句やドキュメントのスキップにより、高 k 値や多数の語句を持つクエリでパフォーマンスを向上させます。これは、最大影響スコアに基づいて語句を必須および非必須のグループに分割し、上位k件の結果に貢献する可能性のある語句に焦点を当てることで実現されます。

  • "DAAT_WAND":WANDアルゴリズムを使用した最適化されたDAATクエリ処理。WANDは、最大影響スコアを活用して非競合ドキュメントをスキップすることで処理されるヒットドキュメント数を削減しますが、ヒットごとのオーバーヘッドが高くなります。このため、WANDは小 k 値や短いクエリではスキップがより実行しやすいためより効率的です。

  • "TAAT_NAIVE":基本的なTerm-at-a-Time(TAAT)クエリ処理。DAAT_MAXSCOREDAAT_WAND と比較して遅いですが、TAAT_NAIVE には独自の利点があります。DAATアルゴリズムがグローバルコレクションパラメータ(avgdl)の変更に関係なく静的なキャッシュされた最大影響スコアを使用するのに対し、TAAT_NAIVE はそのような変更に動的に適応します。

params.bm25_k1

用語頻度の飽和度を制御します。値が大きいほど、ドキュメントランキングにおける用語頻度の重要性が高まります。値の範囲:[1.2, 2.0]。

params.bm25_b

ドキュメント長が正規化される程度を制御します。通常、0〜1の値が使用され、一般的なデフォルトは0.75程度です。1の値は長さの正規化がないことを意味し、0の値は完全な正規化を意味します。

コレクションの作成

次に、定義したスキーマとインデックスパラメータを使用してコレクションを作成します。

client.create_collection(
collection_name='my_collection',
schema=schema,
index_params=index_params
)

テキストデータの挿入

コレクションとインデックスを設定した後、テキストデータの挿入が可能です。このプロセスでは、生のテキストのみを提供する必要があります。前述で定義した組み込み関数が、各テキストエントリーに対応するスパースベクトルを自動的に生成します。

client.insert('my_collection', [
{'text': '情報検索とは研究分野の一つです。'},
{'text': '情報検索は大規模データセットから関連情報を検索することに焦点を当てています。'},
{'text': 'データマイニングと情報検索は研究分野で重複しています。'},
])

コレクションにデータを挿入した後、生のテキストクエリを使用して全文検索を実行できます。Zilliz Cloud はクエリを自動的にスパースベクトルに変換し、BM25アルゴリズムを使用して一致した検索結果をランク付けし、上位K(limit)の結果を返します。

search_params = {
'params': {'level': 10},
}

client.search(
collection_name='my_collection',
data=['情報検索の重点は何ですか?'],
anns_field='sparse',
output_fields=['text'], # 検索結果で返すフィールド;sparse フィールドは出力できません
limit=3,
search_params=search_params
)

パラメータ

説明

search_params

検索パラメータを含む辞書です。

params.level

簡略化された検索最適化で検索精度を制御します。詳細については、リコール率の調整を参照してください。

data

自然言語での生のクエリテキストです。Zilliz Cloud は BM25 関数を使用してテキストクエリを自動的にスパースベクトルに変換します - 事前に計算されたベクトルは提供しないでください。

anns_field

内部的に生成されたスパースベクトルを含むフィールドの名前です。

output_fields

検索結果で返すフィールド名のリストです。BM25 生成の埋め込みを含むスパースベクトルフィールド以外のすべてのフィールドをサポートします。一般的な出力フィールドには、プライマリキーのフィールド(例:id)と元のテキストフィールド(例:text)が含まれます。詳細については、FAQを参照してください。

limit

返す上位マッチの最大数です。

FAQ

いいえ、BM25 関数によって生成されたスパースベクトルは全文検索で直接アクセスまたは出力することはできません。詳細は以下の通りです:

  • BM25 関数はランキングと検索のために内部的にスパースベクトルを生成します
  • これらのベクトルはスパースフィールドに格納されますが、output_fields に含めることはできません
  • 元のテキストフィールドとメタデータ(例:idtext)のみ出力できます

例:

# ❌ エラーが発生 - スパースフィールドを出力することはできません
client.search(
collection_name='my_collection',
data=['query text'],
anns_field='sparse',
output_fields=['text', 'sparse'] # 'sparse' はエラーを引き起こします
limit=3,
search_params=search_params
)

# ✅ これは動作 - テキストフィールドのみ出力
client.search(
collection_name='my_collection',
data=['query text'],
anns_field='sparse',
output_fields=['text']
limit=3,
search_params=search_params
)

アクセスできない場合、なぜスパースベクトルフィールドを定義する必要がありますか?

スパースベクトルフィールドは、ユーザーが直接操作しないデータベースインデックスと同様に、内部的な検索インデックスとして機能します。

設計における理由

  • 關注分離:テキスト(入出力)を操作し、Milvus がベクトル(内部処理)を処理します
  • パフォーマンス:事前計算されたスパースベクトルにより、クエリ時の高速BM25ランキングが可能になります
  • ユーザーエクスペリエンス:シンプルなテキストインターフェースの裏で複雑なベクトル操作を抽象化します

もしベクトルアクセスが必要な場合

  • 全文検索の代わりに手動スパースベクトル操作を使用
  • カスタムスパースベクトルワークフロー用に別のコレクションを作成

詳細については、スパースベクトルを参照してください。