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