在使用 Elasticsearch 构建搜索引擎时,**分词器(Analyzer)** 是一个非常关键的组件。它决定了文本如何被拆分成词汇单元(terms),从而影响搜索结果的相关性和准确性。
#### 一、什么是分词器?
Elasticsearch 中的 **分词器** 是用于将原始文本转换为一组术语(tokens)的工具。这些术语会被用来构建倒排索引,并最终决定文档是否匹配用户的查询。
分词器通常由以下几个部分组成:
– **Character Filters(字符过滤器)**:预处理文本,如去除HTML标签。
– **Tokenizer(分词器)**:将文本按规则切分为词语。
– **Token Filters(词语过滤器)**:对词语进行小写化、停用词过滤、同义词替换等操作。
#### 二、常见的内置分词器
1. **Standard Analyzer(标准分词器)**
– 默认使用的分词器。
– 按 Unicode 规则分割单词,转为小写。
– 示例:`”Hello World”` → `[“hello”, “world”]`
2. **Simple Analyzer(简单分词器)**
– 按非字母字符分割,全部转为小写。
– 示例:`”Hello, World!”` → `[“hello”, “world”]`
3. **Whitespace Analyzer(空白分词器)**
– 仅按空格分割,不进行大小写转换。
4. **Stop Analyzer(停用词分词器)**
– 基于 Simple Analyzer,增加了常见停用词过滤功能。
5. **Language Analyzer(语言分词器)**
– 针对特定语言优化,如 English、French 等。
– 包含停用词过滤、词干提取等功能。
6. **Keyword Analyzer(关键字分词器)**
– 不做任何分词处理,整个输入作为一个 token 输出,常用于聚合或精确匹配字段。
#### 三、中文分词与 IK Analyzer
对于中文来说,内置的分词器并不适用,因为中文没有空格作为分隔符。因此,社区广泛使用 **IK Analyzer** 插件来实现中文分词。
IK Analyzer 提供了两种模式:
– **ik_smart**:粗粒度分词,速度快。
– **ik_max_word**:细粒度分词,适合索引阶段使用。
示例:
“`json
{
“analyzer”: “ik_max_word”,
“text”: “Elasticsearch是一个分布式搜索框架”
}
“`
输出可能是:
“`
[“elasticsearch”, “是”, “一个”, “分布”, “式”, “搜索”, “框架”]
“`
#### 四、自定义分词器
Elasticsearch 允许你通过配置文件自定义 analyzer。例如:
“`json
PUT /my_index
{
“settings”: {
“analysis”: {
“analyzer”: {
“my_custom_analyzer”: {
“type”: “custom”,
“tokenizer”: “standard”,
“filter”: [“lowercase”, “stop”]
}
},
“filter”: {
“stop”: {
“type”: “stop”,
“stopwords”: [“the”, “is”, “and”]
}
}
}
}
}
“`
这样我们就创建了一个自定义分词器 `my_custom_analyzer`,可以用于特定字段。
#### 五、总结
Elasticsearch 的分词器直接影响着搜索效果,选择合适的分词策略并根据业务需求进行定制,是构建高质量搜索引擎的基础。尤其在中文环境下,引入像 IK Analyzer 这样的插件能显著提升搜索体验。