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

テキストフィールド

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

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

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

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

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

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

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

python
from pymilvus import MilvusClient, DataType
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 関数、スパースベクトルインデックス、および全文検索のクエリ構文の詳細については、Full Text Search を参照してください。