目录
- 一、分词基础
- 二、分词组件
- 1、Analyzer(分析器)
- 2、Tokenizer(分词器)
- 3、Token Filter(令牌过滤器)
- 4、Char Filter(字符过滤器)
- 三、分词策略与配置
- 四、分词测试与调试
- 五、中文分词支持
- 六、分词优化
一、分词基础
分词 (Tokenization) 是将文本字符串拆分成独立的词汇或术语的过程。在 Elasticsearch 中,分词通常发生在索引文档时,确保搜索时能够匹配到正确的词汇片段。分词的目标是生成有意义的、可比较的 tokens,同时兼顾搜索效率和查询语义理解。
二、分词组件
1、Analyzer(分析器)
Analyzer 是分词工作的核心,它包含了一个完整的文本分析流程。一个 Analyzer 通常由以下部分组成:
- Tokenizer(分词器):负责将原始文本切割成 tokens。例如,按空格、标点符号或特定语言规则进行分割。
- Token Filters(令牌过滤器):对分词器产生的 tokens 进行进一步处理,如大小写转换、去除停用词、词干提取、同义词扩展等。
- Char Filters(字符过滤器):在分词之前对原始文本进行预处理,如去除 HTML 标签、转义特殊字符等。
2、Tokenizer(分词器)
Elasticsearch 提供了多种内置分词器,适应不同类型的文本和语言特点:
- Standard Tokenizer:基于 Unicode 文本分割算法,适合大多数西方语言。
- Whitespace Tokenizer:仅按空白字符分词,简单但可能产生冗余或过大 tokens。
- Keyword Tokenizer:将整个字段视为单个 token,不进行分词。
- Pattern Tokenizer:基于正则表达式进行分词。
- Language-Specific Tokenizers:如
icu_tokenizer
支持多种语言,以及针对特定语言(如英语、德语、汉语等)的 tokenizer。
3、Token Filter(令牌过滤器)
常用的 Token Filter 包括:
- Lowercase Filter:将 tokens 转换为小写,消除大小写差异。
- Stop Words Filter:移除常见停用词(如“的”、“是”等),减少无意义匹配。
- Stemmer Filter:进行词干提取,将单词还原为其基本形式,提高召回率。
- Synonym Filter:处理同义词和近义词,扩大搜索范围。
- ASCII Folding Filter:将非 ASCII 字符转换为相似的 ASCII 表现,支持模糊匹配。
4、Char Filter(字符过滤器)
常用的 Char Filter 包括:
- HTML Strip Char Filter:去除 HTML 标签和实体。
- Mapping Char Filter:按照映射表替换字符。
- Pattern Replace Char Filter:基于正则表达式替换文本片段。
三、分词策略与配置
Elasticsearch 允许为索引中每个字段指定不同的分析器,以适应各种文本类型和搜索需求。这可以通过在索引映射(mapping)中设置 analyzer
属性来完成。
例如,可以为 title
字段指定 standard
分析器:
PUT my_index
{
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "standard"
}
}
}
}
若需使用自定义分析器,可以先定义分析器,再将其应用于字段:
PUT my_index
{
"settings": {
"analysis": {
"analyzer": {
"my_custom_analyzer": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"my_stopwords"
]
}
},
"filter": {
"my_stopwords": {
"type": "stop",
"stopwords": ["the", "and", "a"]
}
}
}
},
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "my_custom_analyzer"
}
}
}
}
四、分词测试与调试
使用 _analyze
API 可以实时测试分析器对特定文本的分词效果:
POST my_index/_analyze
{
"analyzer": "standard",
"text": "This is a sample text for analysis."
}
响应将包含分词后的 tokens 列表,帮助验证分析器配置是否符合预期。
五、中文分词支持
对于中文等复杂语言,Elasticsearch 提供了专门的支持:
- 内置中文分词器:如
standard
分析器配合cjk_width
和cjk_bigram
过滤器可以提供基本的中文分词支持。 - 第三方插件:如
ik
、jieba
、SmartCN
等,提供了更精准的中文分词和词性标注等功能。这些插件需要额外安装并配置到 Elasticsearch 中。
六、分词优化
- 选择合适的分析器:根据字段内容和搜索需求选择或定制合适的分析器。
- 调整停用词表:针对特定领域或语料库优化停用词表,提升搜索相关性。
- 监控分析性能:跟踪分析器性能,适时调整分词策略以平衡索引速度和查询效率。
- 测试与反馈:通过实际搜索查询和用户反馈不断调整分词配置,提升用户体验。