es的自定义词典和停用词
在 Elasticsearch 中,自定义词典是优化分词效果的核心手段,尤其适用于中文或专业领域的文本处理。以下是关于 ES 自定义词典的完整指南:
- 为什么需要自定义词典?
默认分词不足:
ES 自带的分词器(如 Standard Analyzer)对中文处理效果差(按字拆分),IK 分词器虽支持中文,但默认词库可能缺少特定领域词汇(如 “大模型”“元宇宙”)。
业务需求:
确保专业术语不被拆分(如 “机器学习” 不应拆分为 “机器”“学习”);
识别品牌名、人名、地名等专有名词;
处理网络热词或缩写(如 “yyds”“内卷”)。 - 如何配置自定义词典?
以 IK 分词器为例,步骤如下:
步骤 1:创建词典文件
在 ES 安装目录下的 plugins/ik/config 目录中创建自定义词典文件(如 custom/mydict.dic):
步骤 2:修改配置文件
编辑 plugins/ik/config/IKAnalyzer.cfg.xml,添加自定义词典路径:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties><comment>IK Analyzer 扩展配置</comment><!--用户可以在这里配置自己的扩展字典 --><entry key="ext_dict">custom/mydic.dic</entry><!--用户可以在这里配置自己的扩展停止词字典--><entry key="ext_stopwords">custom/stopwords.dic</entry><!--用户可以在这里配置远程扩展字典 --><!-- <entry key="remote_ext_dict">words_location</entry> --><!--用户可以在这里配置远程扩展停止词字典--><!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>
路径规则:
使用 正斜杠 / 或分号 ; 分隔多个词典;
路径相对于 ik/config 目录(如 custom/mydict.dic 对应实际路径 plugins/ik/config/custom/mydict.dic)
我的myidct.dic自定义词典为:
有限公司
有限责任公司
人工智能
许家印
前首富
步骤 3:重启 ES 并验证
POST http://localhost:9200/_analyze
{"analyzer": "ik_smart","text": "中国前首富许家印"
}
结果:
{"tokens": [{"token": "中国","start_offset": 0,"end_offset": 2,"type": "CN_WORD","position": 0},{"token": "前首富","start_offset": 2,"end_offset": 5,"type": "CN_WORD","position": 1},{"token": "许家印","start_offset": 5,"end_offset": 8,"type": "CN_WORD","position": 2}]
}
去掉mydic.dic里面的内容,重启es,不采用自定义词典后的分词效果如下
{"tokens": [{"token": "中国","start_offset": 0,"end_offset": 2,"type": "CN_WORD","position": 0},{"token": "前","start_offset": 2,"end_offset": 3,"type": "CN_CHAR","position": 1},{"token": "首富","start_offset": 3,"end_offset": 5,"type": "CN_WORD","position": 2},{"token": "许","start_offset": 5,"end_offset": 6,"type": "CN_CHAR","position": 3},{"token": "家","start_offset": 6,"end_offset": 7,"type": "CN_CHAR","position": 4},{"token": "印","start_offset": 7,"end_offset": 8,"type": "CN_CHAR","position": 5}]
}
-----------------------------------------------手动分割线---------------------------------------------------
在 Elasticsearch 中,自定义词典和停用词是两种功能完全相反的配置,分别用于增强分词精度和过滤冗余信息。以下是核心区别和应用场景:
- 核心区别对比
- 示例对比
场景:分析文本 “我爱自然语言处理”
自定义词典配置:
<entry key="ext_dict">custom/nlp.dic</entry>
nlp.dic 内容:
自然语言处理
分词结果:
["我", "爱", "自然语言处理"] // “自然语言处理”被视为一个整体
停用词配置:
<entry key="ext_stopwords">stopwords.dic</entry>
stopwords.dic 内容:
我
的
了
分词结果:
["爱", "自然", "语言", "处理"] // “我”被过滤
- 适用场景