Elasticsearch IK 中文分词器指南:从安装、配置到自定义词典

Elasticsearch IK 中文分词器指南:从安装、配置到自定义词典

Elasticsearch IK 中文分词器详解与实战

1. 什么是分词器 (Analyzer)?

分词器是 Elasticsearch 中用于处理文本数据的核心组件。它的作用是将用户输入的原始文本(如一句话、一段描述)分解成一个个独立的、有意义的"词"或"词条" (Term)。这些词条是后续建立倒排索引和进行搜索匹配的基础。

英文分词:通常以空格、标点符号为界进行切割(如 "Hello World" -> "Hello", "World")。

中文分词 :挑战在于没有天然的分隔符。需要依赖词典和算法来识别词语边界(如 "发展智慧城市与数字经济" -> "发展", "智慧", "城市", "智慧城", "市", "与", "数字", "经济", "数", "字", "经", "济" 或 "发展", "智慧城市", "与", "数字经济")。

使用合适的分词器对中文搜索的准确性和召回率至关重要。

2. 内置标准分词器 (Standard Analyzer) 的局限性

Elasticsearch 自带 standard 分词器,适用于大多数语言,但在处理中文时效果不佳。

(1) 分析英文 (效果良好)

http

复制代码

GET http://192.168.130.61:9200/_analyze

{

"analyzer": "standard",

"text": "The quick brown fox jumps over the lazy dog near the riverbank."

}

结果:

json

复制代码

{

"tokens": [

{"token": "the", ...},

{"token": "quick", ...},

{"token": "brown", ...},

{"token": "fox", ...},

{"token": "jumps", ...},

{"token": "over", ...},

{"token": "the", ...},

{"token": "lazy", ...},

{"token": "dog", ...},

{"token": "near", ...},

{"token": "the", ...},

{"token": "riverbank", ...}

]

}

说明:成功按空格和标点分割,并转为小写。

(2) 分析中文 (效果差,不适用)

http

复制代码

GET http://192.168.130.61:9200/_analyze

{

"analyzer": "standard",

"text": "人工智能改变未来生活"

}

结果:

json

复制代码

{

"tokens": [

{"token": "人", ...},

{"token": "工", ...},

{"token": "智", ...},

{"token": "能", ...},

{"token": "改", ...},

{"token": "变", ...},

{"token": "未", ...},

{"token": "来", ...},

{"token": "生", ...},

{"token": "活", ...}

]

}

说明 :standard 分词器将每个汉字都视为一个独立的词。这显然不符合中文语言习惯,会导致搜索时无法匹配到"人工智能"、"未来生活"这样的完整词语,严重影响搜索效果。

3. 安装 IK 分词器 (Elasticsearch 8.2)

IK 分词器是 Elasticsearch 最流行的中文分词插件,由 Medcl 开发,支持热更新词典。

(1) 下载插件

前往 GitHub 发布页,下载与您的 Elasticsearch 8.2 版本完全匹配的 IK 插件。

GitHub 地址 :https://github.com/medcl/elasticsearch-analysis-ik

直接下载 (示例):

bash

复制代码

# 请根据实际发布的 8.2.x 版本号替换 v8.2.x

wget https://release.infinilabs.com/analysis-ik/stable/elasticsearch-analysis-ik-8.2.2.zip

(2) 安装插件

注意 :以下路径 /data/elasticsearch/softwares/elasticsearch-8.2.2/ 是示例,请替换为您实际的 Elasticsearch 安装路径。

bash

复制代码

# 1. 创建插件目录 (如果不存在)

sudo mkdir -p /data/elasticsearch/softwares/elasticsearch-8.2.2/plugins/ik

# 2. 解压插件到指定目录

sudo unzip elasticsearch-analysis-ik-8.2.2.zip -d /data/elasticsearch/softwares/elasticsearch-8.2.2/plugins/ik

# 3. 确保目录权限正确 (es 用户和组)

# 假设 Elasticsearch 以用户 'elasticsearch' 运行

sudo chown -R elasticsearch:elasticsearch /data/elasticsearch/softwares/elasticsearch-8.2.2/plugins/ik

# 4. (可选) 验证安装

# 可以查看解压后的文件,特别是 config 目录下的配置文件和词典

ls /data/elasticsearch/softwares/elasticsearch-8.2.2/plugins/ik/config/

#或者

cd /data/elasticsearch/softwares/elasticsearch-8.2.2/

bin/elasticsearch-plugin install https://get.infini.cloud/elasticsearch/analysis-ik/8.2.2

chown -R elasticsearch:elasticsearch plugins/

(3) 重启 Elasticsearch 集群

安装插件后必须重启 Elasticsearch 节点才能生效。请依次重启集群中的每个节点。

bash

复制代码

# 示例 (根据您的实际服务名调整)

sudo systemctl restart es

# 或

sudo /data/elasticsearch/softwares/elasticsearch-8.2.2/bin/elasticsearch -d

(4) 验证 IK 插件安装成功

重启后,检查 IK 分词器是否可用:

http

复制代码

GET http://192.168.130.61:9200/_analyze

{

"analyzer": "ik_smart",

"text": "发展智慧城市与数字经济"

}

curl -X GET "http://192.168.130.61:9200/_analyze" -H "Content-Type: application/json" -d'

{

"analyzer": "ik_smart",

"text": "发展智慧城市与数字经济"

}' 2>/dev/null | jq

{

"tokens": [

{

"token": "发展",

"start_offset": 0,

"end_offset": 2,

"type": "CN_WORD",

"position": 0

},

{

"token": "智慧",

"start_offset": 2,

"end_offset": 4,

"type": "CN_WORD",

"position": 1

},

{

"token": "城市",

"start_offset": 4,

"end_offset": 6,

"type": "CN_WORD",

"position": 2

},

{

"token": "与",

"start_offset": 6,

"end_offset": 7,

"type": "CN_CHAR",

"position": 3

},

{

"token": "数字",

"start_offset": 7,

"end_offset": 9,

"type": "CN_WORD",

"position": 4

},

{

"token": "经济",

"start_offset": 9,

"end_offset": 11,

"type": "CN_WORD",

"position": 5

}

]

}

如果返回分词结果而非错误,说明安装成功。

4. 使用 IK 分词器

IK 提供了两种主要的分词模式:

(1) ik_max_word (细粒度分词)

尽可能地将文本进行最细粒度的拆分,会穷尽各种可能的组合。

http

复制代码

GET http://192.168.130.61:9200/_analyze

{

"analyzer": "ik_max_word",

"text": "人工智能改变未来生活"

}

预期结果:

json

复制代码

{

"tokens": [

{"token": "人工", ...},

{"token": "人工智能", ...}, // 识别出"人工智能"

{"token": "智能", ...},

{"token": "改变", ...},

{"token": "未来", ...},

{"token": "未来生活", ...}, // 识别出"未来生活"

{"token": "生活", ...}

]

}

用途:追求最高的召回率,确保不遗漏任何可能的匹配项。适用于搜索场景,但索引会更大。

(2) ik_smart (智能/粗粒度分词)

进行最智能、最少的切分,只输出最少的词单元。

http

复制代码

GET http://192.168.130.61:9200/_analyze

{

"analyzer": "ik_smart",

"text": "人工智能改变未来生活"

}

预期结果:

json

复制代码

{

"tokens": [

{"token": "人工智能", ...},

{"token": "改变", ...},

{"token": "未来", ...},

{"token": "生活", ...}

]

}

用途:追求更高的准确率,减少索引膨胀。适用于索引文档或对性能要求较高的场景。

5. 自定义 IK 分词器词典

IK 的强大之处在于支持自定义词典,可以添加专业术语、新词、网络用语等。

(1) 创建自定义词典目录和文件

进入 IK 插件的 config 目录。

bash

复制代码

cd /data/elasticsearch/softwares/elasticsearch-8.2.2/plugins/ik/config/

# 创建自定义词典目录

sudo mkdir custom-dict

# 创建自定义词典文件 (以 .dic 为后缀)

sudo vim custom-dict/my-words.dic

在 my-words.dic 文件中,每行写一个词条:

text

复制代码

量子计算

区块链技术

元宇宙

新能源汽车

碳中和

智能制造

5G网络

物联网

(2) 配置 IK 加载自定义词典

编辑 IK 的主配置文件 IKAnalyzer.cfg.xml。

bash

复制代码

sudo vim IKAnalyzer.cfg.xml

在 ... 标签内,找到 行,将其修改为指向您创建的词典文件。路径是相对于 config 目录的。

xml

复制代码

IK Analyzer 扩展配置

custom-dict/my-words.dic

(3) 重启 Elasticsearch

修改配置文件后,必须重启 Elasticsearch 集群才能使新词典生效。

bash

复制代码

sudo systemctl restart es

(4) 测试自定义词典效果

http

复制代码

GET http://192.168.130.61:9200/_analyze

{

"analyzer": "ik_smart",

"text": "随着量子计算和区块链技术的发展,元宇宙概念兴起。新能源汽车与智能制造成为碳中和目标下的重要产业,5G网络和物联网技术广泛应用。"

}

curl -X GET "http://192.168.130.62:9200/_analyze" -H "Content-Type: application/json" -d'

{

"analyzer": "ik_smart",

"text": "随着量子计算和区块链技术的发展,元宇宙概念兴起。新能源汽车与智能制造成为碳中和目标下的重要产业,5G网络和物联网技术广泛应用。"

}' 2>/dev/null | jq

预期结果:

json

复制代码

{

"tokens": [

{"token": "随着", ...},

{"token": "量子计算", ...}, // ✅ 自定义词

{"token": "和", ...},

{"token": "区块链技术", ...}, // ✅ 自定义词

{"token": "的", ...},

{"token": "发展", ...},

{"token": "元宇宙", ...}, // ✅ 自定义词

{"token": "概念", ...},

{"token": "兴起", ...},

{"token": "新能源汽车", ...}, // ✅ 自定义词

{"token": "与", ...},

{"token": "智能制造", ...}, // ✅ 自定义词

{"token": "成为", ...},

{"token": "碳中和", ...}, // ✅ 自定义词

{"token": "目标", ...},

{"token": "下", ...},

{"token": "的", ...},

{"token": "重要", ...},

{"token": "产业", ...},

{"token": "5G网络", ...}, // ✅ 自定义词

{"token": "和", ...},

{"token": "物联网", ...}, // ✅ 自定义词

{"token": "技术", ...},

{"token": "广泛", ...},

{"token": "应用", ...}

]

}

可以看到,量子计算、区块链技术、元宇宙、新能源汽车、智能制造、碳中和、5G网络、物联网 这些自定义的专业术语都被成功识别为一个完整的词条,显著提升了分词的准确性。

总结

standard 分词器不适用于中文。

IK 分词器 是处理中文分词的首选插件,提供 ik_max_word (细) 和 ik_smart (粗) 两种模式。

必须安装与 ES 版本严格匹配的 IK 插件,并重启 ES。

通过自定义词典 (ext_dict) 可以极大地提升分词的准确性和业务相关性,这是 IK 的核心优势。

修改词典或配置后务必重启 ES。

相关推荐

地生兰花品种介绍:了解这些地生兰兰花的特点与习性
不是所有蛙都能当儿子,有些,是你蛙爷爷
365体育平台网址

不是所有蛙都能当儿子,有些,是你蛙爷爷

📅 11-03 👁️ 7915
注销账号的方法
365app下载安装

注销账号的方法

📅 08-19 👁️ 1221