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

多言語アナライザー

Zilliz Cloud がテキスト分析を実行する場合、通常はコレクション内のテキストフィールド全体に単一の analyzer を適用します。その analyzer が英語向けに最適化されていると、中国語、スペイン語、フランス語など他の言語で必要とされる tokenization や stemming のルールが大きく異なるため対応できず、再現率が低下します。たとえば、スペイン語の単語 "teléfono"("phone" の意味)を検索すると、英語に特化した analyzer はつまずき、アクセント記号を削除してスペイン語固有の stemming を適用しないため、関連する結果が見落とされる可能性があります。

多言語アナライザーは、単一のコレクション内のテキストフィールドに対して複数の analyzer を構成できるようにすることで、この問題を解決します。これにより、テキストフィールドに多言語のドキュメントを格納でき、Zilliz Cloud は各ドキュメントに適した言語ルールに従ってテキストを分析します。

制限事項​

  • この機能は、BM25 ベースのテキスト検索とスパースベクトルでのみ動作します。詳細については、フルテキスト検索 を参照してください。

  • 単一のコレクション内の各ドキュメントは、言語識別子フィールドの値によって決まる 1 つの analyzer のみを使用できます。

  • パフォーマンスは、analyzer の複雑さとテキストデータのサイズによって異なる場合があります。

概要​

次の図は、Zilliz Cloud で多言語アナライザーを構成して使用するワークフローを示しています。

ZDYIwC1HwhTrdlbfOgNcOZ4OnWg

  1. 多言語アナライザーを構成する:

    • <analyzer_name>: <analyzer_config> という形式で言語固有の analyzer を複数設定します。各 analyzer_config は、Analyzer の概要 で説明されている標準の analyzer_params 構成に従います。

    • 各ドキュメントの analyzer 選択を決定する特別な識別子フィールドを定義します。

    • 不明な言語を処理するための default analyzer を構成します。

  2. コレクションを作成する:

    • 必須フィールドを含むスキーマを定義します:

      • primary_key: ドキュメントの一意の識別子です。

      • text_field: 元のテキストコンテンツを格納します。

      • identifier_field: 各ドキュメントで使用する analyzer を示します。

      • vector_field: BM25 関数によって生成されるスパース埋め込みを格納します。

    • BM25 関数とインデックス作成パラメーターを構成します。

  3. 言語識別子を含むデータを挿入する:

    • さまざまな言語のテキストを含むドキュメントを追加します。各ドキュメントには、使用する analyzer を指定する識別子の値が含まれます。

    • Zilliz Cloud は識別子フィールドに基づいて適切な analyzer を選択し、不明な識別子を持つドキュメントには default analyzer が使用されます。

  4. 言語固有のアナライザーを使用して検索する:

    • analyzer 名を指定したクエリテキストを指定すると、Zilliz Cloud は指定された analyzer を使用してクエリを処理します。

    • 言語固有のルールに従ってトークン化が行われ、検索は類似度に基づいてその言語に適した結果を返します。

ステップ 1: multi_analyzer_params を構成する​

multi_analyzer_params は、Zilliz Cloud が各エンティティに対して適切な analyzer を選択する方法を決定する単一の JSON オブジェクトです:

python
multi_analyzer_params = {
# Define language-specific analyzers
# Each analyzer follows this format: <analyzer_name>: <analyzer_params>
"analyzers": {
"english": {"type": "english"}, # English-optimized analyzer
"chinese": {"type": "chinese"}, # Chinese-optimized analyzer
"default": {"tokenizer": "icu"} # Required fallback analyzer
},
"by_field": "language", # Field determining analyzer selection
"alias": {
"cn": "chinese", # Use "cn" as shorthand for Chinese
"en": "english" # Use "en" as shorthand for English
}
}

パラメーター

必須?

説明

ルール

analyzers

はい

テキストの処理に Zilliz Cloud が使用できる言語固有の analyzer をすべて示します。

analyzers 内の各 analyzer は、<analyzer_name>: <analyzer_params> という形式に従います。

  • 各 analyzer は、標準の analyzer_params 構文で定義します(Analyzer の概要 を参照)。

  • キーが default であるエントリを追加します。by_field に格納された値が他のどの analyzer 名とも一致しない場合、Zilliz Cloud はこの analyzer にフォールバックします。

by_field

はい

すべてのドキュメントについて、Zilliz Cloud が適用すべき言語(つまり analyzer 名)を格納するフィールドの名前です。

  • コレクションで定義された VARCHAR フィールドである必要があります。

  • すべての行の値は、analyzers にリストされている analyzer 名(またはエイリアス)のいずれかと完全に一致する必要があります。

  • 行の値が存在しないか見つからない場合、Zilliz Cloud は自動的に default analyzer を適用します。

alias

いいえ

analyzer のショートカットまたは代替名を作成し、コード内で参照しやすくします。各 analyzer は 1 つ以上のエイリアスを持つことができます。

各エイリアスは、既存の analyzer キーにマップする必要があります。

ステップ 2: コレクションを作成する​

多言語サポートを備えたコレクションを作成するには、特定のフィールドとインデックスを構成する必要があります:

ステップ 1: フィールドを追加する​

このステップでは、4 つの必須フィールドを持つコレクションスキーマを定義します:

  • Primary Key Field (id): コレクション内の各エンティティの一意の識別子です。auto_id=True を設定すると、Zilliz Cloud がこれらの ID を自動的に生成できるようになります。

  • Language Indicator Field (language): この VARCHAR フィールドは、multi_analyzer_params で指定した by_field に対応します。各エンティティの言語識別子を格納し、Zilliz Cloud に使用する analyzer を伝えます。

  • Text Content Field (text): この VARCHAR フィールドは、分析および検索する実際のテキストデータを格納します。enable_analyzer=True の設定は、このフィールドのテキスト分析機能を有効にするため重要です。multi_analyzer_params 構成はこのフィールドに直接関連付けられ、テキストデータと言語固有の analyzer との接続を確立します。

  • ベクトル Field (sparse): このフィールドには、BM25 関数によって生成されたスパースベクトルが格納されます。これらのベクトルはテキストデータを分析可能な形式で表したものであり、Zilliz Cloud が実際に検索する対象です。

python
# Import required modules
from pymilvus import MilvusClient, DataType, Function, FunctionType

# Initialize client
client = MilvusClient(
uri="YOUR_CLUSTER_ENDPOINT",
)

# Initialize a new schema
schema = client.create_schema()

# Step 2.1: Add a primary key field for unique document identification
schema.add_field(
field_name="id", # Field name
datatype=DataType.INT64, # Integer data type
is_primary=True, # Designate as primary key
auto_id=True # Auto-generate IDs (recommended)
)

# Step 2.2: Add language identifier field
# This MUST match the "by_field" value in language_analyzer_config
schema.add_field(
field_name="language", # Field name
datatype=DataType.VARCHAR, # String data type
max_length=255 # Maximum length (adjust as needed)
)

# Step 2.3: Add text content field with multi-language analysis capability
schema.add_field(
field_name="text", # Field name
datatype=DataType.VARCHAR, # String data type
max_length=8192, # Maximum length (adjust based on expected text size)
enable_analyzer=True, # Enable text analysis
multi_analyzer_params=multi_analyzer_params # Connect with our language analyzers
)

# Step 2.4: Add sparse vector field to store the BM25 output
schema.add_field(
field_name="sparse", # Field name
datatype=DataType.SPARSE_FLOAT_VECTOR # Sparse vector data type
)

ステップ 2: BM25 関数を定義する​

生のテキストデータからスパースベクトル表現を生成する BM25 関数を定義します:

python
# Create the BM25 function
bm25_function = Function(
name="text_to_vector", # Descriptive function name
function_type=FunctionType.BM25, # Use BM25 algorithm
input_field_names=["text"], # Process text from this field
output_field_names=["sparse"] # Store vectors in this field
)

# Add the function to our schema
schema.add_function(bm25_function)

この関数は、各テキストエントリの言語識別子に基づいて適切な analyzer を自動的に適用します。BM25 ベースのテキスト検索の詳細については、フルテキスト検索 を参照してください。

ステップ 3: インデックスパラメーターを構成する​

効率的に検索できるようにするには、スパースベクトルフィールドにインデックスを作成します:

python
# Configure index parameters
index_params = client.prepare_index_params()

# Add index for sparse vector field
index_params.add_index(
field_name="sparse", # Field to index (our vector field)
index_type="AUTOINDEX", # Let Milvus choose optimal index type
metric_type="BM25" # Must be BM25 for this feature
)

このインデックスは、効率的な BM25 類似度計算のためにスパースベクトルを整理することで、検索パフォーマンスを向上させます。

ステップ 4: コレクションを作成する​

この最後の作成ステップでは、これまでのすべての構成を統合します:

  • collection_name="multilang_demo" は、後で参照できるようにコレクションに名前を付けます。

  • schema=schema は、定義したフィールド構造と関数を適用します。

  • index_params=index_params は、効率的な検索のためのインデックス戦略を実装します。

python
# Create collection
COLLECTION_NAME = "multilingual_documents"

# Check if collection already exists
if client.has_collection(COLLECTION_NAME):
client.drop_collection(COLLECTION_NAME) # Remove it for this example
print(f"Dropped existing collection: {COLLECTION_NAME}")

# Create the collection
client.create_collection(
collection_name=COLLECTION_NAME, # Collection name
schema=schema, # Our multilingual schema
index_params=index_params # Our search index configuration
)

この時点で、Zilliz Cloud は多言語アナライザーをサポートする空のコレクションを作成し、データを受け取る準備が整います。

ステップ 3: サンプルデータを挿入する​

多言語コレクションにドキュメントを追加する場合、各ドキュメントにはテキストコンテンツと言語識別子の両方を含める必要があります:

python
# Prepare multilingual documents
documents = [
# English documents
{
"text": "Artificial intelligence is transforming technology",
"language": "english", # Using full language name
},
{
"text": "Machine learning models require large datasets",
"language": "en", # Using our defined alias
},
# Chinese documents
{
"text": "人工智能正在改变技术领域",
"language": "chinese", # Using full language name
},
{
"text": "机器学习模型需要大型数据集",
"language": "cn", # Using our defined alias
},
]

# Insert the documents
result = client.insert(COLLECTION_NAME, documents)

# Print results
inserted = result["insert_count"]
print(f"Successfully inserted {inserted} documents")
print("Documents by language: 2 English, 2 Chinese")

# Expected output:
# Successfully inserted 4 documents
# Documents by language: 2 English, 2 Chinese

挿入時には、Zilliz Cloud は次の処理を行います:

  1. 各ドキュメントの language フィールドを読み取ります

  2. text フィールドに対応する analyzer を適用します

  3. BM25 関数を介してスパースベクトル表現を生成します

  4. 元のテキストと生成されたスパースベクトルの両方を格納します

Notes

スパースベクトルを直接指定する必要はありません。BM25 関数が、テキストと指定された analyzer に基づいて自動的に生成します。

ステップ 4: 検索操作を実行する​

英語アナライザーを使用する​

多言語アナライザーを使用して検索する場合、search_params には重要な構成が含まれます:

  • metric_type="BM25" は、インデックスの構成と一致している必要があります。

  • analyzer_name="english" は、クエリテキストに適用する analyzer を指定します。これは、保存されたドキュメントで使用される analyzer とは独立しています。

  • params={"drop_ratio_search": "0"} は BM25 固有の動作を制御します。ここでは、検索内のすべての用語を保持します。詳細については、スパースベクトル を参照してください。

python
search_params = {
"metric_type": "BM25", # Must match index configuration
"analyzer_name": "english", # Analyzer that matches the query language
"drop_ratio_search": "0", # Keep all terms in search (tweak as needed)
}

# Execute the search
english_results = client.search(
collection_name=COLLECTION_NAME, # Collection to search
data=["artificial intelligence"], # Query text
anns_field="sparse", # Field to search against
search_params=search_params, # Search configuration
limit=3, # Max results to return
output_fields=["text", "language"], # Fields to include in the output
consistency_level="Bounded", # Data‑consistency guarantee
)

# Display English search results
print("\n=== English Search Results ===")
for i, hit in enumerate(english_results[0]):
print(f"{i+1}. [{hit.score:.4f}] {hit.entity.get('text')} "
f"(Language: {hit.entity.get('language')})")

# Expected output (English Search Results):
# 1. [2.7881] Artificial intelligence is transforming technology (Language: english)

中国語アナライザーを使用する​

この例では、異なるクエリテキストに対して中国語の analyzer(エイリアス "cn" を使用)に切り替える方法を示します。他のパラメーターはすべて同じままですが、クエリテキストは中国語固有のトークン化ルールを使用して処理されるようになります。

python
search_params["analyzer_name"] = "cn"

chinese_results = client.search(
collection_name=COLLECTION_NAME, # Collection to search
data=["人工智能"], # Query text
anns_field="sparse", # Field to search against
search_params=search_params, # Search configuration
limit=3, # Max results to return
output_fields=["text", "language"], # Fields to include in the output
consistency_level="Bounded", # Data‑consistency guarantee
)

# Display Chinese search results
print("\n=== Chinese Search Results ===")
for i, hit in enumerate(chinese_results[0]):
print(f"{i+1}. [{hit.score:.4f}] {hit.entity.get('text')} "
f"(Language: {hit.entity.get('language')})")

# Expected output (Chinese Search Results):
# 1. [3.3814] 人工智能正在改变技术领域 (Language: chinese)