跳到主要内容
版本:v3.0.x

多语言分析器 Compatible with Milvus 2.5.11+

Milvus 执行文本分析时,通常会在 Collection 的整个文本字段中应用单个分析器。如果该分析器针对英语进行了优化,那么在处理其他语言(如中文、西班牙语或法语)所需的完全不同的标记化和词干规则时就会很吃力,从而导致召回率降低。例如,搜索西班牙语单词*"teléfono"(意为"电话")*时,以英语为重点的分析器会被绊倒:它可能会去掉重音,不应用西班牙语特定的词干,导致相关结果被忽略。

多语言分析器解决了这个问题,它允许你在一个 Collection 中为一个文本字段配置多个分析器。这样,你就可以在一个文本字段中存储多语言文档,Milvus 会根据每个文档的相应语言规则分析文本。

限制

  • 此功能仅适用于基于 BM25 的文本检索和稀疏向量。更多信息,请参阅全文搜索

  • 单个 Collection 中的每个文档只能使用一个分析器,由其语言标识符字段值决定。

  • 性能可能会因分析器的复杂程度和文本数据的大小而有所不同。

概述

下图显示了在 Milvus 中配置和使用多语言分析器的工作流程:

Multi Language Analyzers Workflow多语言分析器工作流程

  1. 配置多语言分析器

    • 使用格式设置多语言分析器:<analyzer_name>: <analyzer_config>,其中每个analyzer_config 都遵循分析仪概述中所述的标准analyzer_params 配置。

    • 定义一个特殊标识符字段,用于确定每个文档的分析仪选择。

    • 配置default 分析器,用于处理未知语言。

  2. 创建 Collection

    • 定义包含基本字段的 Schema:

      • primary_key:唯一文档标识符。

      • text_field:文本字段:存储原始文本内容。

      • identifier_字段:表示对每个文档使用哪个分析器。

      • vector_field:存储将由 BM25 函数生成的稀疏嵌入。

    • 配置 BM25 函数和索引参数。

  3. 插入带有语言标识符的数据

    • 添加包含各种语言文本的文档,其中每个文档都包含一个标识符值,指定要使用的分析器。

    • Milvus 根据标识符字段选择适当的分析器,标识符未知的文档使用default 分析器。

  4. 使用特定语言分析器搜索

    • 提供指定分析器名称的查询文本,Milvus 会使用指定的分析器处理查询。

    • 根据特定语言规则进行标记化,并根据相似度返回适合语言的搜索结果。

第 1 步:配置多分析器参数

multi_analyzer_params 是一个单独的 JSON 对象,它决定了 Milvus 如何为每个实体选择合适的分析器:

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

|

|

列出 Milvus 可用于处理文本的每种特定语言分析器。analyzers 中的每个分析器都遵循以下格式:<analyzer_name>: <analyzer_params>

|

  • 使用标准analyzer_params 语法定义每个分析器(请参阅分析器概述)。
  • 添加一个关键字为default 的条目;只要存储在by_field 中的值与任何其他分析器名称不匹配,Milvus 就会返回到该分析器。

| |

by_field

|

|

为每个文档存储 Milvus 应使用的语言(即分析器名称)的字段名称。

|

  • 必须是 Collection 中定义的VARCHAR 字段。

  • 每一行的值必须与analyzers 中列出的分析器名称(或别名)之一完全匹配。

  • 如果某一行的值缺失或找不到,Milvus 会自动应用default 分析器。

| |

alias

|

|

为分析器创建快捷方式或替代名称,使它们更容易在代码中引用。每个分析器可以有一个或多个别名。

|

每个别名必须映射到现有的分析器键。

|

第 2 步:创建 Collection

创建支持多语言的 Collection 需要配置特定字段和索引:

添加字段

在这一步中,用四个基本字段定义 Collection Schema:

  • 主键字段(id):Collection 中每个实体的唯一标识符。设置auto_id=True 可使 Milvus 自动生成这些 ID。

  • 语言指示符字段(language):此 VARCHAR 字段对应于multi_analyzer_params 中指定的by_field 。它存储每个实体的语言标识符,告诉 Milvus 使用哪种分析器。

  • 文本内容字段(text):这个 VARCHAR 字段存储要分析和搜索的实际文本数据。设置enable_analyzer=True 至关重要,因为它可以激活该字段的文本分析功能。multi_analyzer_params 配置直接连接到该字段,在文本数据和特定语言分析仪之间建立连接。

  • 向量字段(sparse):该字段将存储 BM25 函数生成的稀疏向量。这些向量代表文本数据的可分析形式,也是 Milvus 实际搜索的内容。

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

# Initialize client
client = MilvusClient(
uri="http://localhost:19530",
)

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

定义 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 的文本检索的更多信息,请参阅全文搜索

配置索引参数

为实现高效搜索,请在稀疏向量字段上创建索引:

# 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 相似性计算。

创建 Collection

最后的创建步骤将您之前的所有配置汇集在一起:

  • collection_name="multilang_demo" 为你的 Collection 命名,以备将来参考。

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

此时,Milvus 会创建一个支持多语言分析器的空 Collection,随时准备接收数据。

第 3 步:插入示例数据

向多语言 Collection 添加文档时,每个文档都必须包含文本内容和语言标识符:

# 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

在插入过程中,Milvus

  1. 读取每个文档的language 字段

  2. text 字段应用相应的分析器

  3. 通过 BM25 函数生成稀疏向量表示法

  4. 存储原始文本和生成的稀疏向量

说明

您无需直接提供稀疏向量;BM25 函数会根据您的文本和指定的分析器自动生成稀疏向量。

步骤 4:执行搜索操作符

使用英文分析器

使用多语言分析器搜索时,search_params 包含关键配置:

  • metric_type="BM25" 必须与您的索引配置相匹配。

  • analyzer_name="english" 指定对查询文本应用哪种分析器。这与存储文档中使用的分析器无关。

  • params={"drop_ratio_search": "0"} 控制特定于 BM25 的行为;在这里,它会保留搜索中的所有术语。更多信息,请参阅稀疏向量

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)