Elasticsearch分词器深度实践:IK分词、自定义词典、同义词与拼音扩展
分词是Elasticsearch文本检索的基础,良好的分词策略能显著提升搜索效果。本文将深入探讨IK分词器的使用方法,以及如何通过自定义词典、同义词和拼音扩展来优化中文分词效果,提升搜索的相关性和准确性。
1. IK分词器配置与使用
IK分词器是Elasticsearch中最常用的中文分词器之一,它支持两种分词模式:ik_smart(最粗粒度)和ik_max_word(最细粒度)。
配置IK分词器:
PUT /my_index
{
"settings": {
"analysis": {
"analyzer": {
"ik_analyzer": {
"type": "custom",
"tokenizer": "ik_max_word"
}
}
}
},
"mappings": {
"properties": {
"content": {
"type": "text",
"analyzer": "ik_analyzer",
"search_analyzer": "ik_analyzer"
}
}
}
}
使用IK分词器:
POST /my_index/_analyze
{
"analyzer": "ik_max_word",
"text": "Elasticsearch是一个基于Lucene的搜索引擎"
}
2. 自定义词典实践
IK分词器允许我们添加自定义词典来优化特定词汇的分词效果。
创建自定义词典文件:
- 在Elasticsearch的config目录下创建ik目录
- 添加自定义词典文件custom.dic
- 在IKAnalyzer.cfg.xml中配置自定义词典路径
custom.dic内容示例:
搜索引擎 1000
大数据 1000
机器学习 1000
配置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.dic;</entry>
<!-- 用户可以在这里配置自己的扩展停止词字典 -->
<entry key="ext_stopwords">stopword.dic;</entry>
</properties>
重启Elasticsearch后,自定义词典将生效。
3. 同义词扩展配置
同义词功能可以扩展搜索范围,提高查全率。
配置同义词词典:
- 创建同义词文件synonyms.txt
- 在索引设置中配置同义词分析器
synonyms.txt内容示例:
搜索引擎,搜索引擎技术,信息检索
大数据,海量数据,大规模数据
人工智能,智能计算,智能系统
配置同义词分析器:
PUT /my_index
{
"settings": {
"analysis": {
"filter": {
"my_synonym_filter": {
"type": "synonym",
"synonyms_path": "analysis/synonyms.txt"
}
},
"analyzer": {
"ik_synonym_analyzer": {
"type": "custom",
"tokenizer": "ik_max_word",
"filter": ["my_synonym_filter"]
}
}
}
}
}
4. 拼音分词扩展
拼音分词可以支持拼音搜索,提升用户体验。
安装拼音分词插件:
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-pinyin/releases/download/v7.10.2/elasticsearch-analysis-pinyin-7.10.2.zip
配置拼音分析器:
PUT /my_index
{
"settings": {
"analysis": {
"filter": {
"pinyin_filter": {
"type": "pinyin",
"keep_full_pinyin": true,
"keep_joined_full_pinyin": true,
"keep_separate_first_letter": false,
"keep_none_chinese": true,
"limit_first_letter_length": 16,
"lowercase": true
}
},
"analyzer": {
"ik_pinyin_analyzer": {
"type": "custom",
"tokenizer": "ik_max_word",
"filter": ["pinyin_filter"]
}
}
}
}
}
5. 实例演示与注意事项
下面是一个综合使用IK分词、自定义词典、同义词和拼音分词的完整示例:
PUT /search_demo
{
"settings": {
"analysis": {
"filter": {
"my_synonym_filter": {
"type": "synonym",
"synonyms_path": "analysis/synonyms.txt"
},
"pinyin_filter": {
"type": "pinyin",
"keep_full_pinyin": true,
"keep_joined_full_pinyin": true,
"keep_separate_first_letter": false,
"keep_none_chinese": true,
"limit_first_letter_length": 16,
"lowercase": true
}
},
"analyzer": {
"ik_synonym_pinyin_analyzer": {
"type": "custom",
"tokenizer": "ik_max_word",
"filter": ["my_synonym_filter", "pinyin_filter"]
}
}
}
},
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "ik_synonym_pinyin_analyzer",
"search_analyzer": "ik_synonym_pinyin_analyzer"
},
"content": {
"type": "text",
"analyzer": "ik_synonym_pinyin_analyzer",
"search_analyzer": "ik_synonym_pinyin_analyzer"
}
}
}
}
添加测试数据:
POST /search_demo/_bulk
{ "index": { "_id": "1" } }
{ "title": "Elasticsearch搜索引擎技术", "content": "Elasticsearch是一个基于Lucene的搜索引擎,提供了分布式多用户能力的全文搜索引擎" }
{ "index": { "_id": "2" } }
{ "title": "大数据分析应用", "content": "大数据技术正在改变企业的决策方式,帮助企业从海量数据中提取价值" }
{ "index": { "_id": "3" } }
{ "title": "人工智能与机器学习", "content": "人工智能和机器学习是当前技术领域的热点,正在各个行业得到广泛应用" }
查询测试:
GET /search_demo/_search
{
"query": {
"match": {
"title": "搜索"
}
}
}
注意事项:
- 自定义词典和同义词词典需要重启Elasticsearch才能生效
- 拼音分词插件版本需要与Elasticsearch版本兼容
- 大型同义词词典可能会影响查询性能
- 在生产环境中使用拼音分词时,建议关闭首字母选项以减少索引大小
- 定期更新和维护自定义词典,确保词汇的时效性
Elasticsearch分词流程
不同分词方式比较
| 分词方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| ik_smart | 分词速度快,索引小 | 分词粒度较粗,可能丢失细节 | 对搜索精度要求不高的场景 |
| ik_max_word | 分词粒度细,召回率高 | 索引大,查询速度相对较慢 | 对搜索精度要求高的场景 |
| 自定义词典 | 可针对专业领域优化词汇 | 需要手动维护词典 | 专业领域应用,如医疗、法律等 |
| 同义词扩展 | 提高查全率,扩展搜索范围 | 可能引入噪声,增加索引大小 | 同义词较多的场景,如产品搜索 |
| 拼音分词 | 支持拼音搜索,提升用户体验 | 增加索引大小,可能引入歧义 | 中文用户为主,需要便捷输入的场景 |
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/qq_41840843/article/details/165128001




