Elasticsearch核心:Token Filter工作原理全解析+内置过滤器实战
-
- 一、前言
- 二、基础概念:什么是 Token Filter?
-
- 2.1 核心定义
- 2.2 分词整体流程(Token Filter 位置)
- 三、Token Filter 工作原理与执行流程
-
- 3.1 执行原理
- 3.2 标准执行流程(带序号)
- 四、Token Filter 核心特点
- 五、ES 内置常用 Token Filter(生产高频使用)
-
- 5.1 1. lowercase(小写转换)
- 5.2 2. stop(停用词过滤器)
- 5.3 3. synonym(同义词过滤器)
- 5.4 4. keyword_repeat(关键词重复)
- 5.5 5. ngram / edge_ngram
- 5.6 6. asciifolding
- 5.7 7. unique
- 5.8 8. pinyin(拼音过滤器,插件)
- 六、Token Filter 工作流程真实案例
-
- 案例文本
- 执行步骤
- 七、如何自定义 Token Filter?(实战配置)
-
- 7.1 配置位置
- 7.2 完整示例(小写 + 停用词 + 同义词)
- 八、测试 Token Filter 效果(必学命令)
- 九、Token Filter 高频使用场景
- 十、Token Filter 常见避坑指南
- 十一、总结
|
🌺The Begin🌺点点关注,收藏不迷路🌺 |
一、前言
在 Elasticsearch 分词流程中,Token Filter(词条过滤器) 是决定分词质量、搜索精准度、检索效果的关键组件。大小写转换、去停用词、同义词替换、拼音搜索、去重等核心功能,全都依赖 Token Filter 实现。
很多人不知道:为什么搜索“Apple”找不到“apple”?为什么搜索“电脑”能匹配“计算机”?这些都是 Token Filter 在背后起作用。
本文将从定义、工作流程、执行原理、内置过滤器、自定义配置全方位解析 Token Filter,搭配流程图、实战代码,让你彻底掌握其工作机制。
二、基础概念:什么是 Token Filter?
2.1 核心定义
2.2 分词整体流程(Token Filter 位置)
#mermaid-svg-u50ydlOlOCY45YQN{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-u50ydlOlOCY45YQN .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-u50ydlOlOCY45YQN .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-u50ydlOlOCY45YQN .error-icon{fill:#552222;}#mermaid-svg-u50ydlOlOCY45YQN .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-u50ydlOlOCY45YQN .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-u50ydlOlOCY45YQN .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-u50ydlOlOCY45YQN .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-u50ydlOlOCY45YQN .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-u50ydlOlOCY45YQN .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-u50ydlOlOCY45YQN .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-u50ydlOlOCY45YQN .marker{fill:#333333;stroke:#333333;}#mermaid-svg-u50ydlOlOCY45YQN .marker.cross{stroke:#333333;}#mermaid-svg-u50ydlOlOCY45YQN svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-u50ydlOlOCY45YQN p{margin:0;}#mermaid-svg-u50ydlOlOCY45YQN .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-u50ydlOlOCY45YQN .cluster-label text{fill:#333;}#mermaid-svg-u50ydlOlOCY45YQN .cluster-label span{color:#333;}#mermaid-svg-u50ydlOlOCY45YQN .cluster-label span p{background-color:transparent;}#mermaid-svg-u50ydlOlOCY45YQN .label text,#mermaid-svg-u50ydlOlOCY45YQN span{fill:#333;color:#333;}#mermaid-svg-u50ydlOlOCY45YQN .node rect,#mermaid-svg-u50ydlOlOCY45YQN .node circle,#mermaid-svg-u50ydlOlOCY45YQN .node ellipse,#mermaid-svg-u50ydlOlOCY45YQN .node polygon,#mermaid-svg-u50ydlOlOCY45YQN .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-u50ydlOlOCY45YQN .rough-node .label text,#mermaid-svg-u50ydlOlOCY45YQN .node .label text,#mermaid-svg-u50ydlOlOCY45YQN .image-shape .label,#mermaid-svg-u50ydlOlOCY45YQN .icon-shape .label{text-anchor:middle;}#mermaid-svg-u50ydlOlOCY45YQN .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-u50ydlOlOCY45YQN .rough-node .label,#mermaid-svg-u50ydlOlOCY45YQN .node .label,#mermaid-svg-u50ydlOlOCY45YQN .image-shape .label,#mermaid-svg-u50ydlOlOCY45YQN .icon-shape .label{text-align:center;}#mermaid-svg-u50ydlOlOCY45YQN .node.clickable{cursor:pointer;}#mermaid-svg-u50ydlOlOCY45YQN .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-u50ydlOlOCY45YQN .arrowheadPath{fill:#333333;}#mermaid-svg-u50ydlOlOCY45YQN .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-u50ydlOlOCY45YQN .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-u50ydlOlOCY45YQN .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-u50ydlOlOCY45YQN .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-u50ydlOlOCY45YQN .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-u50ydlOlOCY45YQN .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-u50ydlOlOCY45YQN .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-u50ydlOlOCY45YQN .cluster text{fill:#333;}#mermaid-svg-u50ydlOlOCY45YQN .cluster span{color:#333;}#mermaid-svg-u50ydlOlOCY45YQN div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-u50ydlOlOCY45YQN .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-u50ydlOlOCY45YQN rect.text{fill:none;stroke-width:0;}#mermaid-svg-u50ydlOlOCY45YQN .icon-shape,#mermaid-svg-u50ydlOlOCY45YQN .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-u50ydlOlOCY45YQN .icon-shape p,#mermaid-svg-u50ydlOlOCY45YQN .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-u50ydlOlOCY45YQN .icon-shape .label rect,#mermaid-svg-u50ydlOlOCY45YQN .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-u50ydlOlOCY45YQN .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-u50ydlOlOCY45YQN .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-u50ydlOlOCY45YQN :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
原始文本
Character Filter字符过滤
Tokenizer分词器切分词条
Token Filter词条过滤器(大小写/停用词/同义词)
生成最终词条
构建倒排索引
✅ Token Filter 一定在分词器之后执行,专门处理已经切分好的词条。
三、Token Filter 工作原理与执行流程
3.1 执行原理
- 删除词条(如停用词“的”)
- 修改词条(如转小写)
- 新增词条(如同义词)
- 保持不变
3.2 标准执行流程(带序号)
四、Token Filter 核心特点
五、ES 内置常用 Token Filter(生产高频使用)
5.1 1. lowercase(小写转换)
- 作用:所有英文字母转为小写
- 解决:搜索 Apple / apple 结果一致
- 示例:Hello → hello
5.2 2. stop(停用词过滤器)
- 作用:删除无意义词(的、了、是、在、the、a、is)
- 作用:减少索引大小,提高搜索效率
- 示例:我的电脑 → [电脑]
5.3 3. synonym(同义词过滤器)
- 作用:自动扩展同义词
- 示例:电脑 → [电脑, 计算机, PC]
5.4 4. keyword_repeat(关键词重复)
- 作用:同时保留分词和不分词结果
5.5 5. ngram / edge_ngram
- 作用:自动前缀分词
- 场景:输入提示、自动补全
- 示例:Elastic → [el, ela, elas, elast…]
5.6 6. asciifolding
- 作用:去除音标、特殊符号
- 示例:café → cafe
5.7 7. unique
- 作用:词条去重
- 示例:[ES,ES,搜索] → [ES,搜索]
5.8 8. pinyin(拼音过滤器,插件)
- 作用:将汉字转为拼音
- 场景:拼音搜索
- 示例:elasticsearch → dian nao
六、Token Filter 工作流程真实案例
案例文本
我爱我的Elasticsearch
执行步骤
Tokenizer 分词 [我, 爱, 我, 的, Elasticsearch]
Token Filter 1:stop(去停用词) [爱, Elasticsearch]
Token Filter 2:lowercase(小写) [爱, elasticsearch]
Token Filter 3:unique(去重) [爱, elasticsearch]
最终输出 [爱, elasticsearch]
七、如何自定义 Token Filter?(实战配置)
7.1 配置位置
在索引 settings → analysis → filter 中定义。
7.2 完整示例(小写 + 停用词 + 同义词)
PUT /test_index
{
"settings": {
"analysis": {
"filter": {
// 1. 自定义停用词过滤器
"my_stop_filter": {
"type": "stop",
"stopwords": ["的", "了", "是", "在", "the"]
},
// 2. 自定义同义词过滤器
"my_synonym_filter": {
"type": "synonym",
"synonyms": ["电脑,计算机,PC", "手机,移动电话"]
}
},
"analyzer": {
"my_analyzer": {
"tokenizer": "ik_max_word",
"filter": [
"lowercase", // 小写
"my_stop_filter",// 停用词
"my_synonym_filter",// 同义词
"unique" // 去重
]
}
}
}
},
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "my_analyzer"
}
}
}
}
八、测试 Token Filter 效果(必学命令)
POST /test_index/_analyze
{
"analyzer": "my_analyzer",
"text": "我喜欢用电脑学习Elasticsearch"
}
返回结果会展示:
- 小写转换
- 停用词删除
- 同义词扩展
- 去重效果
九、Token Filter 高频使用场景
十、Token Filter 常见避坑指南
十一、总结

|
🌺The End🌺点点关注,收藏不迷路🌺 |




