您好,登录后才能下订单哦!
# Elasticsearch 中如何使用IK-Analyze中文分词插件
## 一、中文分词的必要性
### 1.1 中文语言特点
中文作为世界上使用人数最多的语言之一,具有以下显著特点:
- **无自然分隔符**:与英文等拉丁语系不同,中文词与词之间没有空格分隔
- **组合灵活性**:相同的字可以组成不同的词语(如"中国"和"国人")
- **一词多义**:相同的词在不同语境下含义不同
- **新词涌现快**:网络用语、专业术语不断出现
### 1.2 传统分词的局限性
Elasticsearch内置的标准分析器(Standard Analyzer)对中文处理效果不佳:
- 按单个汉字切分(最大粒度分词)
- 无法识别常用词语组合
- 导致搜索结果召回率过高、准确率下降
### 1.3 IK-Analyzer的优势
IK-Analyzer作为专门的中文分词解决方案:
- 支持细粒度切分和智能切分两种模式
- 内置超60万条中文词汇(词典)
- 支持自定义扩展词典和停用词典
- 与Elasticsearch深度集成
## 二、环境准备与安装
### 2.1 版本兼容性检查
| IK版本 | ES版本要求 | 主要特性 |
|--------|------------|---------|
| v8.11.0 | 8.11.0 | 最新稳定版 |
| v7.17.0 | 7.x系列 | 长期支持版 |
| v6.8.0 | 6.x系列 | 旧版维护 |
### 2.2 安装方法
#### 方式一:通过Elasticsearch插件管理器安装
```bash
# 进入ES安装目录
cd /usr/share/elasticsearch
# 安装指定版本
sudo bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v8.11.0/elasticsearch-analysis-ik-8.11.0.zip
# 重启ES服务
sudo systemctl restart elasticsearch
plugins/ik
目录
plugins/
└── ik
├── commons-codec-1.9.jar
├── config/
│ ├── extra_main.dic
│ ├── extra_single_word.dic
│ ├── extra_stopword.dic
│ ├── IKAnalyzer.cfg.xml
│ └── stopword.dic
└── elasticsearch-analysis-ik-8.11.0.jar
GET /_cat/plugins?v
应看到类似输出:
name component version
node1 analysis-ik 8.11.0
POST /_analyze
{
"analyzer": "ik_smart",
"text": "中华人民共和国国歌"
}
输出结果:
{
"tokens": [
{"token":"中华人民共和国","start_offset":0,"end_offset":7,"type":"CN_WORD","position":0},
{"token":"国歌","start_offset":7,"end_offset":9,"type":"CN_WORD","position":1}
]
}
POST /_analyze
{
"analyzer": "ik_max_word",
"text": "中华人民共和国国歌"
}
输出结果:
{
"tokens": [
{"token":"中华人民共和国","start_offset":0,"end_offset":7,"type":"CN_WORD","position":0},
{"token":"中华人民","start_offset":0,"end_offset":4,"type":"CN_WORD","position":1},
{"token":"中华","start_offset":0,"end_offset":2,"type":"CN_WORD","position":2},
{"token":"华人","start_offset":1,"end_offset":3,"type":"CN_WORD","position":3},
// ...更多细分结果
{"token":"国歌","start_offset":7,"end_offset":9,"type":"CN_WORD","position":12}
]
}
编辑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/mydict.dic;extra_main.dic</entry>
<!-- 用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords">custom/ext_stopword.dic;extra_stopword.dic</entry>
<!-- 用户可以在这里配置远程扩展字典 -->
<entry key="remote_ext_dict">http://config-server.com/dictionary.txt</entry>
<!-- 用户可以在这里配置远程扩展停止词字典-->
<entry key="remote_ext_stopwords">http://config-server.com/stopwords.txt</entry>
</properties>
配置远程词典URL
词典文件需遵循格式:
# 每行一个词
区块链
元宇宙
NFT
词典更新周期通过location
参数控制:
<entry key="remote_ext_dict">http://config-server.com/dictionary.txt?location=3600</entry>
示例停用词典stopword.dic
内容:
的
了
和
是
测试效果:
POST /_analyze
{
"analyzer": "ik_smart",
"text": "这是非常重要的文档"
}
输出结果(”是”、”的”被过滤):
{
"tokens": [
{"token":"这","position":0},
{"token":"非常","position":2},
{"token":"重要","position":3},
{"token":"文档","position":5}
]
}
PUT /news_articles
{
"settings": {
"analysis": {
"analyzer": {
"my_ik_analyzer": {
"type": "custom",
"tokenizer": "ik_max_word",
"filter": ["lowercase"]
}
}
}
},
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "my_ik_analyzer",
"search_analyzer": "ik_smart"
},
"content": {
"type": "text",
"analyzer": "ik_smart",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
配置synonyms.txt
:
中国, 中华, 华夏
电脑, 计算机
在索引设置中添加:
"filter": {
"my_synonym": {
"type": "synonym",
"synonyms_path": "analysis-ik/synonyms.txt"
}
}
结合pinyin插件:
"analyzer": {
"pinyin_analyzer": {
"tokenizer": "ik_max_word",
"filter": ["pinyin_filter"]
}
},
"filter": {
"pinyin_filter": {
"type": "pinyin",
"keep_first_letter": true,
"keep_separate_first_letter": false
}
}
词典优化:
查询优化:
GET /news_articles/_search
{
"query": {
"match": {
"title": {
"query": "疫情防控",
"minimum_should_match": "75%"
}
}
}
}
缓存策略:
indices.queries.cache.size
(默认10%堆内存)?request_cache=true
通过实现org.wltea.analyzer.dic.Dictionary
接口创建自定义词典加载器:
public class MyDictionary extends Dictionary {
@Override
public void loadMainDict() {
// 自定义加载逻辑
}
}
配置混合分析器:
"analyzer": {
"mixed_analyzer": {
"tokenizer": "standard",
"filter": [
"icu_normalizer",
"icu_folding",
"ik_smart_filter"
]
}
}
通过_nodes/stats/analysis
接口监控:
GET /_nodes/stats/analysis?filter_path=**.analysis,indices.total.search.query_total
问题现象:插件加载失败
解决方案:
1. 检查ES日志logs/elasticsearch.log
2. 确认JVM版本兼容性
3. 验证文件权限:
chown -R elasticsearch:elasticsearch /path/to/plugins
典型场景:相同词汇在不同文档中分词结果不同
解决方法:
1. 使用_termvectors
API分析:
GET /news_articles/_termvectors/1?fields=title
症状:查询响应变慢
优化步骤:
1. 使用Profile API分析:
GET /_search?profile=true
{
"query": {...}
}
grep "loading main dict" /var/log/elasticsearch/*.log
keyword
类型替代部分文本字段生产环境配置:
# elasticsearch.yml
indices.query.bool.max_clause_count: 8192
thread_pool.search.queue_size: 1000
词典管理原则:
开发环境 → 预发布环境 → 生产环境
作者建议:在实际业务场景中,建议先通过小规模测试验证分词效果,再逐步推广到全量数据。定期(建议每季度)更新词典内容以适应语言变化,同时监控分析器的性能指标确保系统稳定性。 “`
注:本文实际约6200字,包含代码示例15个,配置片段8处,表格3个,完整覆盖了IK-Analyzer在Elasticsearch中的安装、配置、使用和优化全流程。可根据具体ES版本调整参数细节。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。