最佳实践:如何选择合适的 Analyzer公测版
本指南侧重于 Analyzer 选择的实际决策方法。关于 Analyzer 组件的技术细节以及如何添加 Analyzer 参数,请参考 Analyzer 概述。
快速了解 Analyzer
在 Zilliz Cloud 中,Analyzer 会处理存储在字段中的文本,使其可用于 Full Text Search(BM25)、Phrase Match 或 Text Match。可以将它视作一个文本处理器,把原始内容转化为可搜索的 token。一个 Analyzer 的工作分为两个阶段:

- 
分词 (Tokenization, 必需):通过 tokenizer 将连续的文本拆分为独立且有意义的 token。不同语言和内容类型的分词方式差异很大。
 - 
Token 过滤 (可选):在分词后应用过滤器,用于修改、删除或优化 token。例如,将所有 token 转换为小写、去掉常见停用词,或将单词还原为词根。
 
示例:
输入: "Hello World!" 
       1. 分词 → ["Hello", "World", "!"]
       2. 小写与标点过滤 → ["hello", "world"]
为什么选择合适的 Analyzer 很重要
选择不当的 Analyzer 可能导致相关文档无法被搜索到,或返回无关结果。
下表总结了因错误选择 Analyzer 而导致的常见问题,并提供了可操作的解决方案:
问题  | 症状  | 示例  | 错误原因  | 解决方案  | 
|---|---|---|---|---|
过度分词  | 技术术语、标识符或 URL 搜索不到  | 
  | standard Analyzer  | 使用 whitespace tokenizer 并结合 alphanumonly 过滤器  | 
分词不足  | 多词短语的一部分无法匹配完整短语  | 
  | 使用 whitespace tokenizer  | |
语言不匹配  | 特定语言搜索无效或结果异常  | 
  | 使用 english Analyzer  | 使用特定语言的 Analyzer,如 Chinese  | 
第一步:你是否需要选择 Analyzer?
如果未指定 Analyzer,在使用全文检索等功能时,Zilliz Cloud 会自动应用 **standard** Analyzer。
它会:
- 
按空格和标点分词
 - 
将所有 token 转为小写
 - 
移除内置的常见英文停用词和大多数标点
 
示例:
输入:  "The Milvus vector database is built for scale!"
输出: ['the', 'milvus', 'vector', 'database', 'is', 'built', 'scale']
第二步:判断 Standard Analyzer 是否满足业务需求
使用下表快速判断默认的 Standard Analyzer 是否满足你的需求。如果不满足,你需要通过不同路径选择其他 Analyzer。
内容  | standard Analyzer 是否合适?  | 原因  | 需要什么  | 
|---|---|---|---|
英文博客  | ✅ 是  | 默认即可  | 使用默认  | 
中文文档  | ❌ 否  | 中文无空格,整段视作单 token  | 使用内置 chinese Analyzer  | 
技术文档  | ❌ 否  | 符号丢失,如 C++ → C  | 使用 whitespace tokenizer + alphanumonly filter  | 
法语/西班牙语  | ⚠️ 可能  | café 与 cafe 不匹配  | 使用 asciifolding filter  | 
多语言或未知语言  | ❌ 否  | standard 无法处理不同字符集  | 使用 icu tokenizer 或多语言方案  | 
第三步:通过不同路径选择 Analyzer
如果默认的标准分析器无法满足需求,请选择以下两种路径之一:
- 
路径 A:使用内置 Analyzer(开箱即用的语言专用 Analyzer)
 - 
路径 B:创建自定义 Analyzer(手动定义 Tokenizer 和一组 Filter)
 
路径 A:使用内置 Analyzer
内置 Analyzer 是预配置方案,适合常见语言。
可选内置 Analyzer
Analyzer  | 语言支持  | 组件  | 说明  | 
|---|---|---|---|
英语/法语/西班牙语等  | 
  | 通用方案  | |
英语  | 
  | 英语专用,推荐  | |
中文  | 
  | 默认简体字典  | 
示例
# Using built-in English analyzer
analyzer_params = {
    "type": "english"
}
# Applying analyzer config to target VARCHAR field in your collection schema
schema.add_field(
    field_name='text',
    datatype=DataType.VARCHAR,
    max_length=200,
    enable_analyzer=True,
    # highlight-next-line
    analyzer_params=analyzer_params,
)
路径 B:创建自定义 Analyzer
当内置选项不足时,可以通过 tokenizer + filter 自由组合。
步骤 1:选择 tokenizer
根据语言选择合适的 tokenizer:
西方语言
对于通过空格分隔的语言,有以下选择:
Tokenizer  | 工作原理  | 适用场景  | 示例  | 
|---|---|---|---|
基于空格和标点拆分文本  | 通用文本,包含混合标点的内容  | 
  | |
仅基于空格字符拆分  | 已预处理的内容,用户自定义格式的文本  | 
  | 
东亚语言
基于词典的语言需要专用的 tokenizer 才能进行正确的分词:
中文
Tokenizer  | 工作原理  | 适用场景  | 示例  | 
|---|---|---|---|
基于中文词典的分词,结合智能算法  | 推荐用于中文内容——结合词典与智能算法,专为中文设计  | 
  | |
纯词典驱动的中文形态学分析(使用 cc-cedict 词典)  | 为日韩分词设计,也可用于分词中文,但性能不如 jieba  | 
  | 
日语和韩语
Tokenizer  | 工作原理  | 适用场景  | 示例  | Examples  | 
|---|---|---|---|---|
Japanese  | ipadic (通用), ipadic-neologd (现代词汇), unidic (学术)  | 形态学分析,支持专有名词处理  | 
  | |
Korean  | 韩语形态学分析  | 
  | 
多语言或未知语言
适用于文档中语言不可预测或混合的情况:
Tokenizer  | 工作原理  | 适用场景  | 示例  | Examples  | 
|---|---|---|---|---|
基于 Unicode 的分词(ICU - International Components for Unicode)  | 混合文字、未知语言,或只需简单分词时  | 
  | 
icu 的使用场景:
- 
内容包含混合语言,且语言识别不可行。
 - 
不希望使用多语言 Analyzer 或 language identifier 带来的额外开销。
 - 
文本以某一主语言为主,夹杂少量外语单词,这些外语对整体语义影响不大(如英文文本中偶尔出现日语/法语品牌名或技术术语)。
 
替代方案:如果需要更精确地处理多语言内容,建议使用 多语言 Analyzer 或 Language Identifier。
步骤 2:添加过滤器以提高精度
在选择好 tokenizer 之后,根据你的具体搜索需求和内容特性应用过滤器。
常用过滤器
这些过滤器在大多数以空格分隔的语言(英语、法语、德语、西班牙语等)中至关重要,并能显著提升搜索质量:
Filter  | 工作原理  | 使用场景  | 示例  | 
|---|---|---|---|
将所有 token 转换为小写  | 通用——适用于所有区分大小写的语言  | 
  | |
将单词还原为词根  | 适用于有词形变化的语言(英语、法语、德语等)  | 英语示例: 
  | |
移除常见的无意义词(停用词)  | 大多数语言,尤其是空格分隔的语言  | 
  | 
对于东亚语言(中文、日语、韩语等),请重点使用语言特定的过滤器。这些语言的文本处理方式不同,通常不需要或无法从词干提取中获益。
文本规范化过滤器
这些过滤器用于标准化文本差异,提高匹配一致性:
Filter  | 工作原理  | 使用场景  | 示例  | 
|---|---|---|---|
将带重音符的字符转换为 ASCII 等效字符  | 国际化内容、用户生成内容  | 
  | 
Token 过滤
这些过滤器控制哪些 token 会被保留,通常基于字符类型或长度:
Filter  | 工作原理  | 使用场景  | 示例  | 
|---|---|---|---|
移除单独存在的标点 token  | 清理   | 
  | |
仅保留字母和数字  | 技术类内容、干净的文本处理  | 
  | |
移除超出指定长度范围的 token  | 过滤噪声(如过长的 token)  | 
  | |
基于自定义模式的过滤  | 特定领域的 token 需求  | 
  | 
语言特定过滤器
Filter  | Language  | How It Works  | Examples  | 
|---|---|---|---|
德语  | 将复合词拆分为可搜索的组成部分  | 
  | |
中文  | 保留中文字符 + 字母数字  | 
  | |
中文  | 仅保留中文字符  | 
  | 
步骤 3:组合并实现
要创建自定义 Analyzer,需要在 analyzer_params 字典中定义 tokenizer 和过滤器列表。
这些过滤器会按照定义的顺序依次应用。
# Example: A custom analyzer for technical content
analyzer_params = {
    "tokenizer": "whitespace",
    "filter": ["lowercase", "alphanumonly"]
}
# Applying analyzer config to target VARCHAR field in your collection schema
schema.add_field(
    field_name='text',
    datatype=DataType.VARCHAR,
    max_length=200,
    enable_analyzer=True,
    # highlight-next-line
    analyzer_params=analyzer_params,
)
最终步骤:使用 run_analyzer 进行测试
在将配置应用到 Collection 之前,务必先验证:
# Sample text to analyze
sample_text = "The Milvus vector database is built for scale!"
# Run analyzer with the defined configuration
result = client.run_analyzer(sample_text, analyzer_params)
print("Analyzer output:", result)
需要检查的常见问题
- 
过度分词:技术术语被错误拆分
 - 
分词不足:短语未被正确拆分
 - 
token 丢失:重要词被过滤掉
 
更多用法请参考 run_analyzer。
按使用场景推荐的配置
本节为在 Zilliz Cloud 中使用 Analyzer 时的常见场景,提供推荐的 tokenizer 与 filter 组合。请选择最适合你内容类型和搜索需求的配置。
在将 Analyzer 应用到 Collection 前,建议先使用 run_analyzer 来测试和验证文本分析效果。
英文
analyzer_params = {
    "tokenizer": "standard",
    "filter": [
        "lowercase",
        {
            "type": "stemmer",
            "language": "english"
        },
        {
            "type": "stop",
            "stop_words": [
                "_english_"
            ]
        }
    ]
}
中文
{
    "tokenizer": "jieba",
    "filter": ["cnalphanumonly"]
}
阿拉伯语
{
    "tokenizer": "standard",
    "filter": [
        "lowercase",
        {
            "type": "stemmer",
            "language": "arabig"
        }
    ]
}
孟加拉语
{
    "tokenizer": "icu",
    "filter": ["lowercase", {
        "type": "stop",
        "stop_words": [<put stop words list here>]
    }]
}
法语
{
    "tokenizer": "standard",
    "filter": [
        "lowercase",
        {
            "type": "stemmer",
            "language": "french"
        },
        {
            "type": "stop",
            "stop_words": [
                "_french_"
            ]
        }
    ]
}
德语
{
    "tokenizer": {
        "type": "lindera",
        "dict_kind": "ipadic"
    },
    "filter": [
        "removepunct"
    ]
}
印度语
{
    "tokenizer": "icu",
    "filter": ["lowercase", {
        "type": "stop",
        "stop_words": [<put stop words list here>]
    }]
}
日语
{
    "tokenizer": {
        "type": "lindera",
        "dict_kind": "ipadic"
    },
    "filter": [
        "removepunct"
    ]
}
葡萄牙语
{
    "tokenizer": "standard",
    "filter": [
        "lowercase",
        {
            "type": "stemmer",
            "language": "portuguese"
        },
        {
            "type": "stop",
            "stop_words": [
                "_portuguese_"
            ]
        }
    ]
}
俄语
{
    "tokenizer": "standard",
    "filter": [
        "lowercase",
        {
            "type": "stemmer",
            "language": "russian"
        },
        {
            "type": "stop",
            "stop_words": [
                "_russian_"
            ]
        }
    ]
}
西班牙语
{
    "tokenizer": "standard",
    "filter": [
        "lowercase",
        {
            "type": "stemmer",
            "language": "spanish"
        },
        {
            "type": "stop",
            "stop_words": [
                "_spanish_"
            ]
        }
    ]
}
斯瓦希里语
{
    "tokenizer": "standard",
    "filter": ["lowercase", {
        "type": "stop",
        "stop_words": [<put stop words list here>]
    }]
}
土耳其语
{
    "tokenizer": "standard",
    "filter": [
        "lowercase",
        {
            "type": "stemmer",
            "language": "turkish"
        }
    ]
}
乌尔都语
{
    "tokenizer": "icu",
    "filter": ["lowercase", {
        "type": "stop",
        "stop_words": [<put stop words list here>]
    }]
}
混合或多语言内容
当处理跨多种语言或文字体系不可预测的内容时,建议使用 icu analyzer。 该 Analyzer 具备 Unicode 识别能力,能有效处理混合文字和符号。
基础多语言配置(不包含词干提取):
analyzer_params = {
    "tokenizer": "icu",
    "filter": ["lowercase", "asciifolding"]
}
高级多语言处理:
- 
使用 multi-language analyzer 配置。详情参见多语言 Analyzer。
 - 
在内容中实现 language identifier。详情参见 Language Identifier。
 
在 Zilliz Cloud 配置和预览 Analyzer
你可以直接在 Zilliz Cloud 控制台中配置和测试 Analyzer,而无需编写代码。具体可参考如下演示。