メインコンテンツまでスキップ

TEXT フィールド

AI 検索アプリケーションでは、ベクトル検索によって意味的に類似したエンティティを検索できますが、アプリケーションでは多くの場合、各検索結果の背後にある元のソーステキストも必要になります。LLM またはエージェントは、そのテキストをコンテキストとして使用し、検索結果を読み取ったり、引用したり、要約したり、プロンプトに含めたりできます。

Zilliz Cloud は、長いソーステキストをエンティティとともに直接保存するための TEXT スカラーフィールド型を提供します。一般的な値には、文章の抜粋、長いドキュメント、記事本文、チケット、ログなどがあります。固定の max_length が必要な VARCHAR とは異なり、TEXT ではコレクションスキーマで最大バイト長を設定する必要はありません。

コレクションスキーマで TEXT フィールドを定義するには、datatype を DataType.TEXT に設定します。

python
schema.add_field(
field_name="content",
datatype=DataType.TEXT,
)

フィールドを定義すると、各エンティティはそのフィールドに文字列値を含めることができます。値は他のスカラーフィールドと同様に挿入し、output_fields にフィールドを指定することで、クエリまたは検索結果から返すことができます。

Notes

TEXT フィールドは null 値をサポートしています。この機能を有効にするには、nullable を True に設定します。詳細については、Nullable Fields を参照してください。

制限​

  • TEXT フィールドを主フィールドとして使用することはできません。主フィールドは INT64 と VARCHAR をサポートしています。

  • TEXT フィールドは PHRASE_MATCH をサポートしていません。

  • TEXT フィールドはデフォルト値をサポートしていません。

  • TEXT フィールドはスカラーインデックスをサポートしていません。

  • TEXT は通常のメタデータフィルタリングを目的としたものではありません。短い文字列メタデータをフィルタリングする必要があり、フィールド値が VARCHAR の長さ制限内に収まる場合は、VARCHAR を使用してください。

  • 外部コレクションでは TEXT フィールドはサポートされていません。

TEXT または VARCHAR を選択する​

TEXT と VARCHAR はどちらも文字列値を保存しますが、サポートするアプリケーションのニーズは異なります。エンティティを識別、分類、またはフィルタリングするための短く上限のあるメタデータには VARCHAR を使用します。LLM またはエージェントが読み取り、引用、要約、またはプロンプトの構築に十分なコンテキストを得られる長いソースコンテンツには TEXT を使用します。

項目VARCHARTEXT
最適な用途エンティティの識別、分類、フィルタリングに使用する短いメタデータ(title、tag、category、external_id など)LLM またはエージェントのワークフローで使用する長いソースコンテンツ(content、passage、article_body、log_message など)
長さの設定max_length が必要です。これはフィールドが保存できる最大バイト数を定義します。最大値は 65,535 バイトです。値がこの制限を超える可能性がある場合は、TEXT を使用してください。max_length は不要なため、スキーマでテキスト値に固定のバイト制限を設定する必要はありません。
ストレージの動作各値を、フィールドに設定された max_length の範囲内で保存します。より大きなテキスト値には、自動ストレージ選択を使用します。
主フィールドのサポート主フィールドとして使用できます。主フィールドとして使用できません。
フィルタリングcategory == "news" や tag in ["ai", "database"] など、フィルター式に含める必要がある短い文字列メタデータに使用します。通常のメタデータフィルタリングを目的としたものではありません。

VARCHAR フィールドの詳細については、VARCHAR Field を参照してください。

TEXT の一般的な用途は、BM25 を使用した全文検索です。このパターンでは、TEXT フィールドに元のソースコンテンツを保存し、BM25 がテキストを分析して疎ベクトルを生成し、キーワードベースの一致をランク付けします。検索結果は、LLM またはエージェントのワークフロー向けのコンテキストとして、一致した TEXT 値を返すことができます。次の例では、BM25 の入力フィールドとして TEXT フィールドを使用する方法を示します。全文検索の概念とクエリオプションについては、全文検索 を参照してください。

ステップ 1: TEXT フィールドを持つコレクションを作成する​

次の例では、ソースコンテンツ用の TEXT フィールドと、BM25 で生成された疎ベクトル用の疎ベクトルフィールドを持つコレクションを作成します。BM25 関数は、content からトークン化されたテキストを sparse に保存される疎ベクトルに変換します。

BM25 全文検索では、入力 TEXT フィールドに enable_analyzer=True を設定する必要があります。

python
from pymilvus import DataType, Function, FunctionType, MilvusClient

client = MilvusClient(uri="YOUR_CLUSTER_ENDPOINT")
COLLECTION_NAME = "text_bm25_collection"

if client.has_collection(COLLECTION_NAME):
client.drop_collection(COLLECTION_NAME)

schema = client.create_schema(auto_id=False, enable_dynamic_field=False)
schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)
schema.add_field(
field_name="content",
datatype=DataType.TEXT,
enable_analyzer=True,
)
schema.add_field(field_name="sparse", datatype=DataType.SPARSE_FLOAT_VECTOR)

bm25_function = Function(
name="content_bm25",
input_field_names=["content"],
output_field_names=["sparse"],
function_type=FunctionType.BM25,
)
schema.add_function(bm25_function)

ステップ 2: 疎ベクトルインデックスを作成する​

BM25 関数によって生成された疎ベクトルフィールドにインデックスを作成します。メトリクスタイプは BM25 に設定する必要があります。

python
index_params = client.prepare_index_params()
index_params.add_index(
field_name="sparse",
index_type="SPARSE_INVERTED_INDEX",
metric_type="BM25",
params={
"inverted_index_algo": "DAAT_MAXSCORE",
"bm25_k1": 1.2,
"bm25_b": 0.75,
},
)

client.create_collection(
collection_name=COLLECTION_NAME,
schema=schema,
index_params=index_params,
)

ステップ 3: TEXT データを挿入する​

TEXT フィールドにテキストを直接挿入します。sparse フィールドには値を指定しないでください。Milvus は、content に BM25 関数を適用して疎ベクトルを内部で生成します。

python
data = [
{
"id": 1,
"content": "Milvus stores vector embeddings and scalar fields in collections. It supports vector search, full text search, and metadata filtering for retrieval applications.",
},
{
"id": 2,
"content": "Long documents are often split into passages before embedding. Store each passage in a TEXT field so search results can return the source text.",
},
{
"id": 3,
"content": "Operational logs and support tickets often contain long natural-language text. TEXT fields can store these values without a fixed max_length setting.",
},
]

client.insert(collection_name=COLLECTION_NAME, data=data)
client.load_collection(collection_name=COLLECTION_NAME)

生のクエリテキストを検索データとして使用し、疎ベクトルフィールドに対して検索を実行します。Milvus はクエリテキストを疎ベクトルに変換し、BM25 で一致をランク付けして、要求された TEXT フィールドを output_fields で返します。

python
results = client.search(
collection_name=COLLECTION_NAME,
data=["how does Milvus store source text for retrieval"],
anns_field="sparse",
limit=2,
output_fields=["content"],
)

ステップ 5: 返された TEXT 値を読み取る​

各検索ヒットには、BM25 スコアと元の TEXT 値が含まれます。

python
for hit in results[0]:
print(f"id: {hit['id']}, score: {hit['distance']}")
print(hit["entity"]["content"])

BM25 関数、疎ベクトルインデックス、および全文検索のクエリ構文の詳細については、全文検索 を参照してください。