文章目录
- 一、主分词器:最基础的文本处理单元
- 主分词器的作用
- 典型主分词器示例
- 二、其他类型的分词器:解决主分词器的局限性
- 1. 子字段分词器(Multi-fields)
- 2. 搜索分词器(Search Analyzer)
- 3. 自定义分词器(Custom Analyzer)
- 4. 专能分词器(Specialized Tokenizers)
- 三、为什么需要多种分词器?
- 总结
在 Elasticsearch(ES)中, 分词器(Analyzer) 是将文本拆分为可检索词元(Token)的核心组件。其中“主分词器”是最基础的类型,但为了满足多样化的文本处理需求,ES 还支持多种其他类型的分词器。以下从定义、分类、典型场景三个维度详细说明:
一、主分词器:最基础的文本处理单元
主分词器是 ES 中默认用于索引和搜索阶段的分词器,负责将原始文本(如中文句子、英文段落)拆分为最小可检索的词元(Token)。它是每个 text
类型字段的“核心处理器”,决定了文本的基础拆分逻辑。
主分词器的作用
- 索引阶段:将文档内容(如“北京天安门”)拆分为词元(如
北京
、天安门
),写入倒排索引。 - 搜索阶段:将用户输入的查询词(如“天安门”)拆分为词元(如
天安门
),与索引中的词元匹配。
典型主分词器示例
- 中文场景:
ik_max_word
(细粒度拆分,如“人工智能”→人工
、智能
、人工智能
)。 - 英文场景:
standard
(标准分词器,按空格和标点拆分,转小写)。 - 日文场景:
kuromoji
(基于日语词法分析的分词器)。
二、其他类型的分词器:解决主分词器的局限性
主分词器虽能处理基础需求,但面对复杂场景(如多语言混合、拼音检索、模糊匹配)时,需要其他类型的分词器补充。ES 支持以下几类“非主分词器”:
1. 子字段分词器(Multi-fields)
通过 fields
属性为同一个字段创建多个子字段,每个子字段使用不同的分词器,满足不同查询需求。
核心价值:一个字段支持多种拆分方式(如汉字、拼音、全拼)。
示例(中文+拼音混合索引):
{"mappings": {"properties": {"title": {"type": "text","analyzer": "ik_max_word", // 主分词器(处理汉字)"fields": {"pinyin": { // 子字段(处理拼音)"type": "text","analyzer": "pinyin_analyzer"},"keyword": { // 子字段(保留原文,用于精确匹配)"type": "keyword"}}}}}
}
- 主字段
title
:用ik_max_word
拆分汉字(如“中国”→中国
)。 - 子字段
title.pinyin
:用拼音分词器拆分(如“中国”→zhong
、guo
、z
、g
)。 - 子字段
title.keyword
:用keyword
分词器(不拆分,保留原文“中国”)。
2. 搜索分词器(Search Analyzer)
通过 search_analyzer
显式指定搜索阶段使用的分词器(与索引阶段的主分词器不同)。
核心价值:解决“索引时细粒度拆分,搜索时粗粒度匹配”的矛盾。
典型场景:
索引时用 ik_max_word
(细粒度,如“北京大学”→北京
、大学
、北京大学
),搜索时用 ik_smart
(粗粒度,如用户输入“北大”→北大
)。此时需用 search_analyzer
确保搜索词拆分与索引词元匹配。
配置示例:
{"mappings": {"properties": {"content": {"type": "text","analyzer": "ik_max_word", // 索引分词器(细粒度)"search_analyzer": "ik_smart" // 搜索分词器(粗粒度)}}}
}
3. 自定义分词器(Custom Analyzer)
通过组合 字符过滤器(Char Filter)
、分词器(Tokenizer)
、词元过滤器(Token Filter)
自定义分词逻辑,满足特定业务需求。
核心价值:灵活处理特殊文本(如去除HTML标签、保留数字范围)。
组成结构:
analyzer: {char_filter: [ ... ], # 预处理文本(如替换特殊符号)tokenizer: ..., # 拆分文本为词元(核心)filter: [ ... ] # 过滤/修改词元(如转小写、去停用词)
}
示例(处理英文+数字混合文本):
{"settings": {"analysis": {"analyzer": {"custom_analyzer": {"char_filter": ["html_strip"], # 去除HTML标签"tokenizer": "standard", # 按空格/标点拆分"filter": ["lowercase", # 转小写"asciifolding", # 转换特殊字符(如é→e)"stop" # 去除停用词(如the、and)]}}}}
}
4. 专能分词器(Specialized Tokenizers)
ES 内置了多种针对特定场景的分词器,无需自定义即可直接使用:
keyword
分词器:不拆分文本,将整个字符串作为一个词元(用于精确匹配,如品牌名、ID)。pattern
分词器:按正则表达式拆分(如按-
拆分“2023-05-11”→2023
、05
、11
)。ngram
分词器:生成连续字符组合(如“苹果”→苹
、果
、苹果
),用于模糊搜索(如输入“苹”召回“苹果”)。path_hierarchy
分词器:按层级拆分路径(如“/a/b/c”→/a
、/a/b
、/a/b/c
),用于目录结构检索。
三、为什么需要多种分词器?
主分词器是基础,但单一分词器无法满足所有需求:
- 多维度检索:用户可能用汉字、拼音、首字母搜索同一内容(需子字段分词器)。
- 精度与性能平衡:索引时细粒度拆分(提升召回),搜索时粗粒度拆分(提升性能,需搜索分词器)。
- 特殊文本处理:如去除HTML标签、保留数字范围(需自定义分词器)。
- 跨语言支持:中文用
ik
,英文用standard
,日文用kuromoji
(需不同主分词器)。
总结
主分词器是 ES 中最基础的分词器,负责索引和搜索的默认文本处理。但为了应对复杂场景,ES 还支持子字段分词器(多维度检索)、搜索分词器(精度与性能平衡)、自定义分词器(特殊文本处理)和专能分词器(特定场景)。理解这些类型的核心差异,能帮助你根据业务需求(如召回率、准确性、性能)选择合适的分词方案。