欢迎光临
我们一直在努力

Elasticsearch核心:Token Filter工作原理全解析+内置过滤器实战

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 核心定义

  • Token Filter(词条过滤器) 是 Analyzer(分析器)的三大核心组件之一。
  • 作用:对 Tokenizer 分词后的词条(Token)进行二次加工、修改、过滤、增强。
  • 特点:接收词条流 → 处理 → 输出新词条流,可以有 0 个或多个。
  • 一句话总结:分词后的“精加工车间”。
  • 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 执行原理

  • Tokenizer 将文本切分成独立词条数组。
  • 依次交给多个 Token Filter 按顺序处理。
  • 每个过滤器可以:
    • 删除词条(如停用词“的”)
    • 修改词条(如转小写)
    • 新增词条(如同义词)
    • 保持不变
  • 最终输出处理后的词条流。
  • 3.2 标准执行流程(带序号)

  • 原始文本:Hello World 我的ES
  • 字符过滤:无变化
  • 分词器切分:[Hello, World, 我, 的, ES]
  • Token Filter 执行
  • 小写过滤器 → [hello, world, 我, 的, es]
  • 停用词过滤器 → [hello, world, es]
  • 最终词条:[hello, world, es]

  • 四、Token Filter 核心特点

  • 顺序执行:配置多个过滤器时,从上到下依次执行
  • 无数量限制:可以配置 0~N 个
  • 不改变原文:只改变分词结果
  • 搜索/索引双阶段生效
  • 中文搜索必备:停用词、同义词、拼音全靠它

  • 五、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 高频使用场景

  • 英文搜索:必须加 lowercase
  • 中文搜索:必须加 停用词过滤器
  • 电商搜索:必须加 同义词过滤器
  • 输入提示:必须加 edge_ngram
  • 拼音搜索:必须加 pinyin 过滤器
  • 去重优化:必须加 unique

  • 十、Token Filter 常见避坑指南

  • 过滤器顺序错误 → 分词异常
  • 停用词过滤过度 → 搜索不到精准内容
  • 同义词配置错误 → 结果混乱
  • 索引与查询使用不同过滤器 → 搜不到数据
  • text 字段忘记加过滤器 → 中英文大小写不匹配

  • 十一、总结

  • Token Filter:Analyzer 的后置加工组件,专门处理分词后的词条。
  • 执行位置:Tokenizer 分词之后。
  • 核心能力:增、删、改、重写字条。
  • 工作流程:接收词条 → 顺序过滤 → 输出最终词条。
  • 必备过滤器:lowercase、stop、synonym、ngram、pinyin。
  • 作用:决定搜索是否精准、是否智能、是否高效。
  • 在这里插入图片描述

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

    赞(0)
    未经允许不得转载:171主机测评 » Elasticsearch核心:Token Filter工作原理全解析+内置过滤器实战
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址