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

全文検索

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

関連性スコアリングにはBM25アルゴリズムを使用しており、特に検索拡張型生成(RAG)のシナリオにおいて、特定の検索語句と密接に一致するドキュメントを優先するのに役立ちます。

📘Notes

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

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

BM25の実装

Zilliz Cloudは、情報検索システムで広く採用されているBM25関連性スコアリングアルゴリズムを活用した全文検索を提供しています。Zilliz Cloudはこのアルゴリズムを検索ワークフローに統合し、正確で関連性順にランキングされたテキスト結果を提供します。

Zilliz Cloudにおける全文検索は、以下のワークフローに従います。

  1. 生テキスト入力: 埋め込みモデルを必要とせず、プレーンテキストでテキストドキュメントを挿入またはクエリを提供します。

  2. テキスト分析: Zilliz Cloudはアナライザを使用してテキストをインデックスおよび検索可能な意味のある語句に処理します。

  3. BM25関数処理: 組み込みの関数がこれらの語句をBM25スコアリングに最適化されたスパースベクトル表現に変換します。

  4. コレクションストア: Zilliz Cloudは生成されたスパース埋め込みをコレクションに格納し、高速な検索とランキングを可能にします。

  5. BM25関連性スコアリング: 検索時にZilliz CloudはBM25関数を適用し、ドキュメントの関連性を計算してクエリ語句に最も一致するランキング付き結果を返します。

DfPMwP6ZahhHlLbIN0gcG9d7nQM

全文検索を使用するには、次の主な手順に従います。

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

  2. データの挿入: 生テキストドキュメントをコレクションに取り込みます。

  3. 検索の実行: 自然言語のクエリテキストを使用して、BM25関連性に基づいたランキング付き結果を取得します。

BM25による全文検索を有効にするには、必要なフィールドを持つコレクションを準備し、スパースベクトルを生成するBM25関数を定義し、インデックスを設定してからコレクションを作成する必要があります。

スキーマフィールドの定義

コレクションスキーマには、少なくとも以下の3つの必須フィールドを含める必要があります。

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

  • テキストフィールド (VARCHAR): 生テキストドキュメントを格納します。Zilliz CloudがBM25関連性ランキングのためにテキストを処理できるように、enable_analyzer=True を設定する必要があります。デフォルトでは、Zilliz Cloudはテキスト分析にstandard アナライザを使用します。別のアナライザを設定するには、アナライザ概要を参照してください。

  • スパースベクトルフィールド (SPARSE_FLOAT_VECTOR): BM25関数によって自動生成されたスパース埋め込みを格納します。

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) # Primary field
schema.add_field(field_name="text", datatype=DataType.VARCHAR, max_length=1000, enable_analyzer=True) # Text field
schema.add_field(field_name="sparse", datatype=DataType.SPARSE_FLOAT_VECTOR) # Sparse vector field; no dim required for sparse vectors

上記の設定において、

  • id: 主キーとして機能し、auto_id=True により自動的に生成されます。

  • text: 全文検索操作用の生テキストデータを格納します。データ型は VARCHAR でなければなりません。これは、Zilliz Cloud におけるテキスト格納用の文字列データ型です。

  • sparse: 全文検索操作のために内部で生成されたスパース埋め込みを格納するためのベクトルフィールドです。データ型は SPARSE_FLOAT_VECTOR でなければなりません。

BM25関数の定義

BM25関数は、トークン化されたテキストをBM25スコアリングをサポートする疎ベクトルに変換します。

関数を定義し、スキーマに追加します:

bm25_function = Function(
name="text_bm25_emb", # Function name
input_field_names=["text"], # Name of the VARCHAR field containing raw text data
output_field_names=["sparse"], # Name of the SPARSE_FLOAT_VECTOR field reserved to store generated embeddings
function_type=FunctionType.BM25, # Set to `BM25`
)

schema.add_function(bm25_function)

パラメータ

説明

name

関数の名前。この関数は、text フィールドから取得した生テキストを BM25 互換の疎ベクトルに変換し、sparse フィールドに格納します。

input_field_names

テキストから疎ベクトルへの変換が必要な VARCHAR フィールドの名前。FunctionType.BM25 の場合、このパラメータにはフィールド名を1つだけ指定できます。

output_field_names

内部で生成された疎ベクトルを格納するフィールドの名前。FunctionType.BM25 の場合、このパラメータにはフィールド名を1つだけ指定できます。

function_type

使用する関数のタイプ。必ず FunctionType.BM25 を指定する必要があります。

📘Notes

複数の VARCHAR フィールドに対して BM25 処理が必要な場合は、各フィールドごとに1つの BM25 関数を定義し、それぞれに一意の名前と出力フィールドを設定してください。

インデックスの設定

必要なフィールドと組み込み関数を使用してスキーマを定義した後、コレクションのインデックスを設定します。このプロセスを簡略化するために、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 は、最大インパクトスコアを利用して競争力のない文書をスキップすることで、ヒット文書の評価数を減らしますが、1ヒットあたりのオーバーヘッドが高くなります。そのため、WAND は小さな k 値や短いクエリに対してより効率的です。

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

params.bm25_k1

語頻度の飽和度を制御します。値を高くすると、文書ランキングにおける語頻度の重要度が増します。値の範囲: [1.2, 2.0]。

params.bm25_b

文書長の正規化の程度を制御します。通常は 0 から 1 の間の値が使用され、一般的なデフォルト値は約 0.75 です。1 の場合、長さの正規化は行われず、0 の場合、完全に正規化されます。

Create the collection

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

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

テキストデータの挿入

コレクションとインデックスの設定が完了したら、テキストデータを挿入できます。このプロセスでは、生のテキストを提供するだけで済みます。先ほど定義した組み込み関数が、各テキストエントリに対応するスパースベクトルを自動的に生成します。

client.insert('my_collection', [
{'text': 'information retrieval is a field of study.'},
{'text': 'information retrieval focuses on finding relevant information in large datasets.'},
{'text': 'data mining and information retrieval overlap in research.'},
])

コレクションにデータを挿入したら、生のテキストクエリを使用してフルテキスト検索を実行できます。Zilliz Cloudは自動的にクエリをスパースベクトルに変換し、BM25アルゴリズムを用いてマッチした検索結果をランキングしたうえで、上位K件(limitで指定された件数)の結果を返します。

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

res = client.search(
collection_name='my_collection',
data=['whats the focus of information retrieval?'],
anns_field='sparse',
output_fields=['text'], # Fields to return in search results; sparse field cannot be output
limit=3,
search_params=search_params
)

print(res)

パラメータ

説明

search_params

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

params.level

簡略化された検索最適化により、検索精度を制御します。詳細については、Tune Recall Rate を参照してください。

data

自然言語による生のクエリテキスト。Zilliz Cloud は、BM25関数を使用してテキストクエリを自動的に疎ベクトルに変換します — 事前に計算済みのベクトルを提供しないでください。

anns_field

内部で生成された疎ベクトルを含むフィールドの名前。

output_fields

検索結果に含めるフィールド名のリスト。BM25関数によって生成された埋め込みを含む疎ベクトルフィールド以外のすべてのフィールドをサポートします。一般的な出力フィールドには、主キー(例: id)や元のテキストフィールド(例: text)が含まれます。詳細については、FAQ を参照してください。

limit

返される上位一致件数の最大値。

FAQ

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

  • BM25 関数はランキングおよび検索のために内部で疎ベクトルを生成します

  • これらのベクトルは疎フィールドに保存されますが、output_fields に含めることはできません

  • 出力できるのは元のテキストフィールドとメタデータ(例: idtext)のみです

例:

# ❌ This throws an error - you cannot output the sparse field
client.search(
collection_name='my_collection',
data=['query text'],
anns_field='sparse',
output_fields=['text', 'sparse'] # 'sparse' causes an error
limit=3,
search_params=search_params
)

# ✅ This works - output text fields only
client.search(
collection_name='my_collection',
data=['query text'],
anns_field='sparse',
output_fields=['text']
limit=3,
search_params=search_params
)

疎ベクトルフィールドを定義する必要があるのはなぜですか?アクセスできないのに

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

設計思想:

  • 関心の分離: ユーザーはテキスト(入力/出力)を扱い、Milvus がベクトル(内部処理)を処理します。

  • パフォーマンス: 事前に計算された疎ベクトルにより、クエリ時に高速な BM25 ランキングが可能になります。

  • ユーザーエクスペリエンス: 複雑なベクトル操作をシンプルなテキストインターフェースの背後に隠蔽します。

ベクトルへのアクセスが必要な場合:

  • フルテキスト検索ではなく、手動での疎ベクトル操作を使用してください。

  • カスタムの疎ベクトルワークフロー用に別のコレクションを作成してください。

詳細については、Sparse Vector を参照してください。