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

全文検索

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

BM25関連性スコアリングを使用するこの機能は、特定の検索用語と密接に一致するドキュメントを優先するRAG(検索拡張生成)シナリオで特に価値があります。

📘Notes

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

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

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 ランキングが可能になります

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

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

  • 全文検索ではなく、手動の疎ベクトル操作を使用してください

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

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