Elasticsearch 分词器 工作原理

发布时间:2026/6/26 2:35:37

Elasticsearch 分词器 工作原理 如果说倒排索引是ES的“心脏”那分词器就是ES的“消化系统”——它决定了一句话被拆成什么样的“营养颗粒”词项存入索引。如果分词分得不好搜索就搜不准。分词器的工作过程并非简单的“按空格切分”它在内部严格分为3 个顺序执行的组件第一阶段字符过滤器Character Filters这是预处理环节在正式分词前对原始文本进行“清洗”。作用剔除无用字符或进行统一替换。内置示例HTML Strip去除p、a等HTML标签提取纯文本。Mapping将替换为and或将全角数字替换为半角123。注意这里不改变词意只做“净化”。第二阶段分词器Tokenizer这是最核心的环节。它将清洗后的文本按照一定规则切分成一个个独立的Token词项/单元并记录每个词在原文中的位置Position和偏移量Offset。常见切分规则按空格/标点切分whitespace/standard适用于英文。按单字切分keyword不分词整个字段作为一个词适用于邮编、状态码。按语义切分ik_smart/jieba专用于中文因为中文没有空格必须依赖词典判断。关键点Tokenizer 决定了最小的搜索粒度。切得太细如“中华人民共和国”切成“中”“华”“人”搜“民国”会误出切得太粗整词搜“中华”又搜不到。第三阶段词项过滤器Token Filters分词完成后对生成的 Token 列表进行二次加工。这里可以串联多个过滤器按顺序执行。Lowercase小写化将Apple-apple保证搜索时不区分大小写。Stopword停用词过滤剔除无意义的虚词如中文的“的”、“了”英文的the、a。这些词出现太频繁会严重拉低搜索评分并占用磁盘。Synonym同义词扩展当遇到“番茄”时自动添加一个同义词 Token “西红柿”。这样用户搜“西红柿”也能命中包含“番茄”的文档。Stemming词干提取英文专有将running-runcats-cat。将时态和复数统一为词根提高召回率。你必须要懂的两个“时机”巨坑预警分词器在 ES 中应用在两个不同的时间点使用的可以是不同的分词器Index Time索引时文档写入时使用index analyzer将文本切碎存入倒排索引。Search Time搜索时用户输入搜索词时使用search analyzer将查询词切碎。最佳实践为了让搜索更智能索引时通常细粒度尽可能多地切出词根搜索时粗粒度保持短语完整性。如果两者用反了就会导致“搜得到但不相关”或“相关但搜不到”。实战举例中文分词是怎么“猜”的以 IK 分词器为例英文分词简单但中文是连续字符机器不知道哪里断词。IK 分词器的工作原理是“词典匹配 歧义消除”词典Dictionary内置一个庞大的词库如南京市,长江,大桥。切分过程输入南京市长江大桥智能模式ik_smart从左向右扫描优先匹配最长词输出[南京市, 长江大桥]。细粒度模式ik_max_word穷尽所有可能输出[南京市, 南京, 市长, 长江大桥, 长江, 大桥]。避坑如果词典里没有“江大桥”IK 就会切分成[南京市, 长江, 大桥]。所以词典热更新是中文搜索维护的重点。总结对比帮助记忆组件英文类比中文特例Character Filter去掉b标签将中文全角逗号“”替换为英文“,”Tokenizer核心按空格切Hello World依赖词典切你好世界Token FilterRunning-run西红柿添加同义词番茄如果分词效果不理想该怎么办不用 ES 自带中文务必安装 IK 或 HanLP 插件。自定义词典将公司内部专有名词如“王者荣耀”、“特斯拉Model3”加入 IK 的main.dic。使用term查询验证可以通过_analyzeAPI 直接测试分词结果确保索引和搜索的分词器一致。POST /_analyze { analyzer: ik_smart, text: 南京市长江大桥 }

相关新闻