1. 引言
本文将深入探讨如何通过自定义分词器、合理使用 analyzer
和 search_analyzer
来优化 Elasticsearch 的搜索效果。
2. 自定义分词器(IK、Standard、Whitespace)
2.1 分词器简介
在 Elasticsearch 中,分词器(Analyzer) 是文本处理的核心组件,负责将原始文本转换为可搜索的词项(tokens)。一个完整的分词器通常由以下三部分组成:
- 字符过滤器(Character Filters):对原始文本进行预处理,如去除 HTML 标签、转换字符等。
- 分词器(Tokenizer):将文本按规则分割成词项,是分词器的核心部分。
- 词项过滤器(Token Filters):对分词后的词项进行进一步处理,如小写转换、去除停用词、提取词干等。
通过合理配置这些组件,Elasticsearch 能够适应不同语言和文本类型的需求。你可以使用内置的分词器,也可以根据业务需求自定义分词器。
2.2 常见分词器
2.2.1 Standard 分词器
Standard 分词器 是 Elasticsearch 的默认分词器,适用于大多数语言的文本处理。它基于 Unicode 字符集进行分词,能够处理多种语言,但对中文等需要特殊分词规则的语言支持有限。
-
特性:
- 对文本进行标准化处理。
- 使用 Unicode 字符集进行分词。
- 适合处理英语等拉丁字母语言,但对中文分词效果不佳。
-
示例:
PUT /my_index { "settings": { "analysis": { "tokenizer": { "standard_tokenizer": { "type": "standard" } }, "analyzer": { "standard_analyzer": { "type": "custom", "tokenizer": "standard_tokenizer" } } } } }
-
适用场景:
- 适用于英语等不需要复杂分词规则的语言。
- 适合一般性的文本分析,不涉及特定语言的分词细节。
2.2.2 IK 分词器
IK 分词器 是一款专门为中文设计的分词器,支持 最细粒度(ik_max_word
)和 智能粒度(ik_smart
)两种模式。它通过字典和规则结合的方式对中文进行分词,能够有效处理中文文本的复杂性。
-
IK 最细粒度模式(
ik_max_word
):- 尽可能将文本拆分为更多的词项。例如,“南京市长江大桥”会被分词为“南京市”、“长江大桥”、“南京”、“市长”等多个词项。
-
IK 智能粒度模式(
ik_smart
):- 将文本拆分为较少的词项,适合信息检索和查询。例如,“南京市长江大桥”会被分词为“南京市长江大桥”。
-
特性:
- 高效的中文分词能力,支持细粒度和智能分词。
- 支持拼音和词典扩展。
-
示例:
PUT /my_index { "settings": { "analysis": { "tokenizer": { "ik_tokenizer": { "type": "ik_max_word" } }, "analyzer": { "ik_analyzer": { "type": "custom", "tokenizer": "ik_tokenizer" } } } } }
-
适用场景:
- 适用于中文及其他东亚语言的文本分析。
- 适合中文搜索引擎、社交网络分析、新闻内容分词等场景。
2.2.3 Whitespace 分词器
Whitespace 分词器 是一种简单的分词器,仅根据空格将文本拆分为词项。它不会对词项进行任何其他处理,适合处理简单的格式化文本。
-
特性:
- 仅根据空格进行分词。
- 不进行任何复杂的处理,如小写转换或停用词过滤。
-
示例:
PUT /my_index { "settings": { "analysis": { "tokenizer": { "whitespace_tokenizer": { "type": "whitespace" } }, "analyzer": { "whitespace_analyzer": { "type": "custom", "tokenizer": "whitespace_tokenizer" } } } } }
-
适用场景:
- 适用于简单的英文文本或格式化文本,如日志文件、配置文件等。
- 适合不需要复杂分词的场景。
2.3 自定义分词器的应用
在实际项目中,内置的分词器可能无法完全满足需求,此时可以通过自定义分词器来实现更精细的文本处理。例如,针对中英文混合文本,可以结合 IK 分词器和 Standard 分词器,创建适合业务需求的分词器。
自定义分词器配置示例
PUT /my_index
{
"settings": {
"analysis": {
"tokenizer": {
"ik_tokenizer": {
"type": "ik_max_word"
},
"standard_tokenizer": {
"type": "standard"
}
},
"filter": {
"lowercase_filter": {
"type": "lowercase"
},
"stopwords_filter": {
"type": "stop",
"stopwords": "_english_"
}
},
"analyzer": {
"custom_analyzer": {
"type": "custom",
"tokenizer": "ik_tokenizer",
"filter": ["lowercase_filter", "stopwords_filter"]
}
}
}
}
}
3. analyzer 和 search_analyzer
3.1 analyzer:文档分析器
analyzer
用于在 文档索引时 对文本进行处理,决定了字段在存储之前如何被分词和过滤。它直接影响倒排索引的构建,进而影响搜索的精度和性能。
示例:使用 analyzer 创建索引
PUT /my_index
{
"settings": {
"analysis": {
"tokenizer": {
"my_standard_tokenizer": {
"type": "standard"
}
},
"filter": {
"lowercase_filter": {
"type": "lowercase"
}
},
"analyzer": {
"my_custom_analyzer": {
"type": "custom",
"tokenizer": "my_standard_tokenizer",
"filter": ["lowercase_filter"]
}
}
}
}
}
3.2 search_analyzer:搜索分析器
search_analyzer
用于在 查询时 对搜索文本进行处理。它允许在搜索时使用与索引时不同的分词规则,从而提高查询的灵活性和精度。
示例:使用 search_analyzer 进行搜索
PUT /my_index
{
"settings": {
"analysis": {
"tokenizer": {
"standard_tokenizer": {
"type": "standard"
},
"whitespace_tokenizer": {
"type": "whitespace"
}
},
"filter": {
"lowercase_filter": {
"type": "lowercase"
}
},
"analyzer": {
"my_index_analyzer": {
"type": "custom",
"tokenizer": "standard_tokenizer",
"filter": ["lowercase_filter"]
}
},
"search_analyzer": {
"my_search_analyzer": {
"type": "custom",
"tokenizer": "whitespace_tokenizer"
}
}
}
}
}
3.3 analyzer 和 search_analyzer 的区别与应用场景
analyzer | search_analyzer | |
---|---|---|
定义 | 用于 索引时 对文档进行分析和分词 | 用于 查询时 对查询文本进行分析 |
影响范围 | 影响文档存储方式 | 影响查询时的分词结果 |
常见应用场景 | 存储时需要严格处理文本的字段(如产品描述、日志) | 查询时需要更灵活的分词方式(如同 |
义词、短语查询) |
- analyzer 应用于 文档索引时,通常涉及对文本的正式分词与分析。
- search_analyzer 允许在 查询时 使用不同的分词策略,尤其适用于搜索时需要使用不同分词规则的情况。
4. 总结
选择合适的分词器和分析器对于 Elasticsearch 查询性能至关重要。通过精确配置 analyzer
和 search_analyzer
,你可以大大提高搜索精度和响应速度。希望本文对你深入了解 Elasticsearch 中的分析器提供了帮助!
参考资料
- Elasticsearch 官方文档
- 《Elasticsearch 权威指南》