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

文字列フィールド

Zilliz Cloudクラスターでは、文字列データを保存するためにVARCHARがデータ型として使用されます。

VARCHARフィールドを定義する際、以下の2つのパラメータが必要です:

  • datatypeDataType.VARCHARに設定します。

  • max_lengthを指定します。これはVARCHARフィールドが保存できる最大バイト数を定義します。max_lengthの有効範囲は1から65,535です。

📘注釈

Zilliz CloudはVARCHARフィールドに対してnull値とデフォルト値をサポートしています。これらの機能を有効にするには、nullableTrueに設定し、default_valueを文字列値に設定してください。詳細については、Nullable & Defaultを参照してください。

VARCHARフィールドの追加

Zilliz Cloudクラスターに文字列データを保存するには、コレクションスキーマにVARCHARフィールドを定義します。以下は、2つのVARCHARフィールドを持つコレクションスキーマを定義する例です:

  • varchar_field1:最大100バイトを保存し、null値を許可し、デフォルト値は"Unknown"です。

  • varchar_field2:最大200バイトを保存し、null値を許可しますが、デフォルト値はありません。

📘注釈

スキーマ定義時にenable_dynamic_fields=Trueを設定すると、Zilliz Cloudでは事前に定義されていないスカラーフィールドの挿入が可能になります。しかし、これによりクエリと管理の複雑さが増し、パフォーマンスに影響を与える可能性があります。詳細については、Dynamic Fieldを参照してください。

# 必要なライブラリをインポート
from pymilvus import MilvusClient, DataType

# サーバーアドレスを定義
SERVER_ADDR = "YOUR_CLUSTER_ENDPOINT"

# MilvusClientインスタンスを作成
client = MilvusClient(uri=SERVER_ADDR)

# コレクションスキーマを定義
schema = client.create_schema(
auto_id=False,
enable_dynamic_fields=True,
)

# デフォルト値"Unknown"を持つnull値をサポートする`varchar_field1`を追加
schema.add_field(field_name="varchar_field1", datatype=DataType.VARCHAR, max_length=100, nullable=True, default_value="Unknown")
# デフォルト値を持たないnull値をサポートする`varchar_field2`を追加
schema.add_field(field_name="varchar_field2", datatype=DataType.VARCHAR, max_length=200, nullable=True)
schema.add_field(field_name="pk", datatype=DataType.INT64, is_primary=True)
schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=3)

インデックスパラメータの設定

インデックスは検索およびクエリのパフォーマンスを向上させるのに役立ちます。Zilliz Cloudクラスターでは、ベクトルフィールドに対してはインデックスが必須ですが、スカラーフィールドに対しては任意です。

以下の例では、ベクトルフィールドembeddingとスカラーフィールドvarchar_field1に対してAUTOINDEXインデックスタイプを使用してインデックスを作成しています。このタイプでは、Milvusがデータ型に基づいて最も適切なインデックスを自動的に選択します。

# インデックスパラメータを設定

index_params = client.prepare_index_params()

# AUTOINDEXで`varchar_field1`をインデックス化
index_params.add_index(
field_name="varchar_field1",
index_type="AUTOINDEX",
index_name="varchar_index"
)

# AUTOINDEXで`embedding`をインデックス化しmetric_typeを指定
index_params.add_index(
field_name="embedding",
index_type="AUTOINDEX", # 自動インデックスを使用して複雑なインデックス設定を簡略化
metric_type="COSINE" # 類似度メトリックタイプを指定、オプションにはL2、COSINE、IPが含まれます
)

コレクションの作成

スキーマとインデックスが定義されたら、文字列フィールドを含むコレクションを作成します。

# コレクションを作成
client.create_collection(
collection_name="my_collection",
schema=schema,
index_params=index_params
)

データの挿入

コレクションを作成した後、スキーマに一致するエンティティを挿入します。

# サンプルデータ
data = [
{"varchar_field1": "Product A", "varchar_field2": "High quality product", "pk": 1, "embedding": [0.1, 0.2, 0.3]},
{"varchar_field1": "Product B", "pk": 2, "embedding": [0.4, 0.5, 0.6]}, # varchar_field2フィールドは省略されており、NULLになるはず
{"varchar_field1": None, "varchar_field2": None, "pk": 3, "embedding": [0.2, 0.3, 0.1]}, # `varchar_field1`は`Unknown`にデフォルト設定、`varchar_field2`はNULL
{"varchar_field1": "Product C", "varchar_field2": None, "pk": 4, "embedding": [0.5, 0.7, 0.2]}, # `varchar_field2`はNULL
{"varchar_field1": None, "varchar_field2": "Exclusive deal", "pk": 5, "embedding": [0.6, 0.4, 0.8]}, # `varchar_field1`は`Unknown`にデフォルト設定
{"varchar_field1": "Unknown", "varchar_field2": None, "pk": 6, "embedding": [0.8, 0.5, 0.3]}, # `varchar_field2`はNULL
{"varchar_field1": "", "varchar_field2": "Best seller", "pk": 7, "embedding": [0.8, 0.5, 0.3]}, # 空文字列はNULLとして扱われない
]

# データを挿入
client.insert(
collection_name="my_collection",
data=data
)

フィルター式を使用したクエリ

エンティティを挿入した後、queryメソッドを使用して指定されたフィルター式に一致するエンティティを取得します。

varchar_field1が文字列"Product A"に一致するエンティティを取得するには:

# `varchar_field1`を"Product A"でフィルター
filter = 'varchar_field1 == "Product A"'

res = client.query(
collection_name="my_collection",
filter=filter,
output_fields=["varchar_field1", "varchar_field2"]
)

print(res)

# 例示出力:
# data: [
# "{'varchar_field1': 'Product A', 'varchar_field2': 'High quality product', 'pk': 1}"
# ]

varchar_field2がnullであるエンティティを取得するには:

# `varchar_field2`がnullのエンティティをフィルター
filter = 'varchar_field2 is null'

res = client.query(
collection_name="my_collection",
filter=filter,
output_fields=["varchar_field1", "varchar_field2"]
)

print(res)

# 例示出力:
# data: [
# "{'varchar_field1': 'Product B', 'varchar_field2': None, 'pk': 2}",
# "{'varchar_field1': 'Unknown', 'varchar_field2': None, 'pk': 3}",
# "{'varchar_field1': 'Product C', 'varchar_field2': None, 'pk': 4}",
# "{'varchar_field1': 'Unknown', 'varchar_field2': None, 'pk': 6}"
# ]

varchar_field1"Unknown"の値を持つエンティティを取得するには、以下の式を使用します。varchar_field1のデフォルト値は"Unknown"であるため、予想される結果にはvarchar_field1が明示的に"Unknown"に設定されたエンティティ、またはvarchar_field1がnullに設定されたエンティティが含まれます。

# `varchar_field1`が`Unknown`の値を持つエンティティをフィルター
filter = 'varchar_field1 == "Unknown"'

res = client.query(
collection_name="my_collection",
filter=filter,
output_fields=["varchar_field1", "varchar_field2"]
)

print(res)

# 例示出力:
# data: [
# "{'varchar_field1': 'Unknown', 'varchar_field2': None, 'pk': 3}",
# "{'varchar_field1': 'Unknown', 'varchar_field2': 'Exclusive deal', 'pk': 5}",
# "{'varchar_field1': 'Unknown', 'varchar_field2': None, 'pk': 6}"
# ]

フィルター式を使用したベクトル検索

基本的なスカラーフィールドのフィルタリングに加えて、ベクトル類似検索とスカラーフィールドフィルターを組み合わせることができます。たとえば、以下のコードはベクトル検索にスカラーフィールドフィルターを追加する方法を示しています:

# 文字列フィルタリングで検索

# "Best seller"の値を持つ`varchar_field2`をフィルター
filter = 'varchar_field2 == "Best seller"'

res = client.search(
collection_name="my_collection",
data=[[0.3, -0.6, 0.1]],
limit=5,
search_params={"params": {"nprobe": 10}},
output_fields=["varchar_field1", "varchar_field2"],
filter=filter
)

print(res)

# 例示出力:
# data: [
# "[{'id': 7, 'distance': -0.04468163847923279, 'entity': {'varchar_field1': '', 'varchar_field2': 'Best seller'}}]"
# ]