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

テキストフィールド

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

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

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

python
from pymilvus import MilvusClient, DataType

client = MilvusClient(uri="YOUR_CLUSTER_ENDPOINT")
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,
)

フィールドを定義した後、各エンティティにはそのフィールドの文字列値を含めることができます。値は他のスカラーフィールドと同様に挿入し、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 は、エンティティを識別、分類、フィルタリングするための短く上限のあるメタデータに使用します。TEXT は、LLM またはエージェントが読み取り、引用、要約、あるいはプロンプトを構築するための十分なコンテキストを得られる、より長いソースコンテンツに使用します。

観点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 値を返すことができます。次の例は、TEXT フィールドを BM25 の入力フィールドとして使用する方法を示しています。全文検索の概念とクエリオプションについては、Full Text Search を参照してください。

ステップ 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 関数、スパースベクトルインデックス、全文検索のクエリ構文の詳細については、全文検索 を参照してください。