在 Elasticsearch 中,自定义词典是优化分词效果的核心手段,尤其适用于中文或专业领域的文本处理。以下是关于 ES 自定义词典的完整指南:
- 为什么需要自定义词典?
默认分词不足:
ES 自带的分词器(如 Standard Analyzer)对中文处理效果差(按字拆分),IK 分词器虽支持中文,但默认词库可能缺少特定领域词汇(如 "大模型""元宇宙")。
业务需求:
确保专业术语不被拆分(如 "机器学习" 不应拆分为 "机器""学习");
识别品牌名、人名、地名等专有名词;
处理网络热词或缩写(如 "yyds""内卷")。 - 如何配置自定义词典?
以 IK 分词器为例,步骤如下:
步骤 1:创建词典文件
在 ES 安装目录下的 plugins/ik/config 目录中创建自定义词典文件(如 custom/mydict.dic):
步骤 2:修改配置文件
编辑 plugins/ik/config/IKAnalyzer.cfg.xml,添加自定义词典路径:
bash
<?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自定义词典为:
bash
有限公司
有限责任公司
人工智能
许家印
前首富
步骤 3:重启 ES 并验证
bash
POST http://localhost:9200/_analyze
{
"analyzer": "ik_smart",
"text": "中国前首富许家印"
}
结果:
bash
{
"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,不采用自定义词典后的分词效果如下
bash
{
"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 中,自定义词典和停用词是两种功能完全相反的配置,分别用于增强分词精度和过滤冗余信息。以下是核心区别和应用场景:
- 核心区别对比
- 示例对比
场景:分析文本 "我爱自然语言处理"
自定义词典配置:
bash
<entry key="ext_dict">custom/nlp.dic</entry>
nlp.dic 内容:
bash
自然语言处理
分词结果:
bash
["我", "爱", "自然语言处理"] // "自然语言处理"被视为一个整体
停用词配置:
bash
<entry key="ext_stopwords">stopwords.dic</entry>
stopwords.dic 内容:
bash
我
的
了
分词结果:
bash
["爱", "自然", "语言", "处理"] // "我"被过滤
- 适用场景