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

多言語アナライザー

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

多言語アナライザーはこの問題を解決し、1つのコレクション内のテキストフィールドに対して複数のアナライザーを設定できるようにします。これにより、多言語のドキュメントを同一のテキストフィールドに格納でき、Zilliz Cloud は各ドキュメントに応じて適切な言語ルールに基づいてテキストを分析します。

制限

  • この機能は BM25 ベースのテキスト検索および疎ベクトルでのみ動作します。詳細については、Full Text Search を参照してください。

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

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

概要

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

ZDYIwC1HwhTrdlbfOgNcOZ4OnWg

  1. 多言語アナライザーの設定:

    • <analyzer_name>: <analyzer_config> の形式で、複数の言語固有のアナライザーを設定します。ここで、各 analyzer_configAnalyzer Overview で説明されている標準的な analyzer_params 設定に従います。

    • 各ドキュメントに対してどのアナライザーを選択するかを決定するための特別な識別子フィールドを定義します。

    • 不明な言語を処理するための default アナライザーを設定します。

  2. コレクションの作成:

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

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

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

      • identifier_field: 各ドキュメントに使用するアナライザーを示す。

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

    • BM25関数およびインデックスパラメータを設定します。

  3. 言語識別子付きでデータを挿入:

    • 複数の言語のテキストを含むドキュメントを追加し、各ドキュメントに使用するアナライザーを指定する識別子値を含めます。

    • Zilliz Cloud は識別子フィールドに基づいて適切なアナライザーを選択し、未知の識別子を持つドキュメントには default アナライザーを使用します。

  4. 言語固有のアナライザーによる検索:

    • クエリテキストとともにアナライザー名を指定すると、Zilliz Cloud は指定されたアナライザーを使用してクエリを処理します。

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

ステップ 1: multi_analyzer_params の設定

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

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 がテキスト処理に使用できるすべての言語固有アナライザーをリストします。

analyzers 内の各アナライザーは、次の形式に従います: <analyzer_name>: <analyzer_params>

  • 各アナライザーは標準的な analyzer_params 構文で定義してください(詳細はAnalyzer Overviewを参照)。

  • キーが default のエントリを追加してください。Zilliz Cloud は、by_field に格納された値が他のどのアナライザー名にも一致しない場合、このアナライザーにフォールバックします。

by_field

はい

各ドキュメントごとに Zilliz Cloud が適用すべき言語(つまりアナライザー名)を格納するフィールドの名前です。

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

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

  • 行の値が欠損している、または見つからない場合、Zilliz Cloud は自動的に default アナライザーを適用します。

alias

いいえ

アナライザーのショートカットまたは代替名を作成し、コード内での参照を容易にします。各アナライザーには1つ以上のエイリアスを設定できます。

各エイリアスは、既存のアナライザーキーにマッピングされている必要があります。

Step 2: Create collection

多言語サポート付きのコレクションを作成するには、特定のフィールドおよびインデックスを設定する必要があります。

Step 1: Add fields

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

  • 主キーフィールド (id): コレクション内の各エンティティを一意に識別するためのフィールドです。auto_id=True を設定すると、Zilliz Cloud が自動的にこれらの ID を生成します。

  • 言語 Indicator Field (language): この VARCHAR フィールドは、multi_analyzer_params で指定した by_field に対応します。各エンティティの言語識別子を格納し、Zilliz Cloud がどのアナライザーを使用するかを指示します。

  • テキストコンテンツフィールド (text): この VARCHAR フィールドは、分析および検索したい実際のテキストデータを格納します。このフィールドに対して enable_analyzer=True を設定することは極めて重要であり、これによりテキスト分析機能が有効になります。multi_analyzer_params 設定はこのフィールドに直接アタッチされ、テキストデータと言語固有アナライザーとの関連付けを行います。

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

# 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関数を定義します:

# 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)

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

ステップ 3: インデックスパラメータの設定

効率的な検索を可能にするため、スパースベクトルフィールドにインデックスを作成します:

# 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 は、効率的な検索のためのインデックス戦略を実装します。

# 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 は多言語アナライザーをサポートする空のコレクションを作成し、データの受信準備が整います。

Step 3: Insert example data

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

# 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 フィールドに該当するアナライザーを適用します。

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

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

📘Notes

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

ステップ 4: 検索操作の実行

English アナライザーを使用する

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

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

  • analyzer_name="english" は、クエリテキストに適用するアナライザーを指定します。これは、格納済みドキュメントに使用されたアナライザーとは独立しています。

  • params={"drop_ratio_search": "0"} は BM25 固有の動作を制御します。この例では、検索時にすべての用語を保持します。詳細については、Sparse Vector を参照してください。

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)

中国語アナライザーの使用

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

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)