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

全文検索

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

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

📘注釈

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

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

概要

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

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

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

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

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

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

DfPMwP6ZahhHlLbIN0gcG9d7nQM

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

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

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

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

全文検索を有効にするには、特定のスキーマを持つコレクションを作成します。このスキーマには、3つの必須フィールドが含まれている必要があります。

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

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

  • Zilliz CloudがVARCHARフィールド用に自動生成するスパース埋め込みを格納するために予約された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 analyzerを使用します。別のアナライザーを設定するには、アナライザー概要を参照してください。

  • 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_MAXSCOREおよびDAAT_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アルゴリズムを使用して一致した検索結果をランク付けし、topK (limit) の結果を返します。

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

client.search(
collection_name='my_collection',
data=['情報検索の焦点は何ですか?'],
anns_field='sparse',
output_fields=['text'], # 検索結果で返すフィールド;スパースフィールドは出力できません
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=['クエリテキスト'],
anns_field='sparse',
output_fields=['text', 'sparse'] # 'sparse' はエラーを引き起こします
limit=3,
search_params=search_params
)

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

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

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

設計理念

  • 關注点の分離: テキストの操作と出力はユーザーが行い、Milvusはベクトルの内部処理を担当する

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

  • ユーザーエクスペリエンス: 複雑なベクトル操作を単純なテキストインターフェースで抽象化する

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

  • 全文検索ではなく、手動スパースベクトル操作を使用する

  • カスタムスパースベクトルワークフロー用に別のコレクションを作成する

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