elasticsearch 默认提供的分词器 standard 对中文分词不优化,效果差,一般会安装第三方中文分词插件,通常首先 elasticsearch-analysis-ik 插件,它其实是 ik 针对的 es 的定制版。本文主要围绕 es ik 的安装及使用进行讲解。
elasticsearch-analysis-ik 安装
在安装 elasticsearch-analysis-ik 第三方之前,我们首先要了解 es 的插件管理工具 elasticsearch-plugin 的使用。
elasticsearch-plugin 使用
现在的 elasticsearch 安装完后,在安装目录的 bin 目录下会存在 elasticsearch-plugin 命令工具,用它来对 es 插件进行管理。
bin/elasticsearch-plugin
其实该命令的是软连接,原始路径是:
libexec/bin/elasticsearch-plugin
再进一步看脚本代码,你会发现,它是通过 elasticsearch-cli 执行 libexec/lib/tools/plugin-cli/elasticsearch-plugin-cli-x.x.x.jar。
但一般使用者了解 elasticsearch-plugin 命令使用就可:
# 安装指定的插件到当前 ES 节点中
elasticsearch-plugin install {plugin_url}
# 显示当前 ES 节点已经安装的插件列表
elasticsearch-plugin list
# 删除已安装的插件
elasticsearch-plugin remove {plugin_name}
在安装插件时,要保证安装的插件与 ES 版本一致。
elasticsearch-analysis-ik 安装
在确定要安装的 ik 版本之后,执行如下命令:
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v{X.X.X}/elasticsearch-analysis-ik-{X.X.X}.zip
其中,{X.X.X} 表示指定的 ik 版本,如上这是远程安装方式,如果网络不好,也可以提前下载包之后,本地安装。
Linux 下本地安装命令示例如下:
./bin/elasticsearch-plugin install file:///home/knowledgedict/elasticsearch-analysis-ik-X.X.X.zip
Windows 下本地安装命令示例如下:
./bin/elasticsearch-plugin install file:///C:/home/knowledgedict/elasticsearch-analysis-ik-X.X.X.zip
执行完安装命令后,我们会发现在 plugins 中多了 analysis-ik 目录,这里面主要存放的是源码 jar 包,此外,在 config 文件里也多了 analysis-ik 目录,里面主要是 ik 相关的配置,如 IKAnalyzer.cfg.xml 配置、词典文件等。
# 两个新增目录路径
libexec/plugins/analysis-ik/
libexec/config/analysis-ik/
elasticsearch-analysis-ik 使用
ES 5.X 版本开始安装完的 elasticsearch-analysis-ik 提供了两个分词器,分别对应名称是 ik_max_word 和 ik_smart,ik_max_word 是索引侧的分词器,走全切模式,ik_smart 是搜索侧的分词器,走智能分词,属于搜索模式。
索引 mapping 设置
安装完 elasticsearch-analysis-ik 后,我们可以指定索引及指定字段设置可用的分析器(analyzer),示例如下:
{
"qa": {
"mappings": {
"qa": {
"_all": {
"enabled": false
},
"properties": {
"question": {
"type": "text",
"store": true,
"similarity": "BM25",
"analyzer": "ik_max_word",
"search_analyzer": "ik_smart"
},
"answer": {
"type": "text",
"store": false,
"similarity": "BM25",
"analyzer": "ik_max_word",
"search_analyzer": "ik_smart"
},
...
}
}
}
}
}
如上示例中,analyzer 指定 ik_max_word,即索引侧使用 ik 全切模式,search_analyzer 设置 ik_smart,即搜索侧使用 ik 智能分词模式。
查看 ik 分词结果
es 提供了查看分词结果的 api _analyze,具体示例如下:
GET {index}/_analyze
{
"analyzer" : "ik_smart",
"text" : "es 中文分词器安装"
}
输出如下:
{
"tokens": [
{
"token": "es",
"start_offset": 0,
"end_offset": 2,
"type": "CN_WORD",
"position": 0
},
{
"token": "中文",
"start_offset": 3,
"end_offset": 5,
"type": "CN_WORD",
"position": 1
},
{
"token": "分词器",
"start_offset": 5,
"end_offset": 8,
"type": "CN_WORD",
"position": 2
},
{
"token": "安装",
"start_offset": 8,
"end_offset": 10,
"type": "CN_WORD",
"position": 3
}
]
}
elasticsearch-analysis-ik 自定义词典
elasticsearch-analysis-ik 本质是 ik 分词器,使用者根据实际需求可以扩展自定义的词典,具体主要分为如下 2 大类,每类又分为本地配置和远程配置 2 种:
自定义扩展词典;
自定义扩展停用词典;
elasticsearch-analysis-ik 配置文件为 IKAnalyzer.cfg.xml,它位于 libexec/config/analysis-ik 目录下,具体配置结构如下:
IK Analyzer 扩展配置
当然,如果开发者认为 ik 默认的词表有问题,也可以进行调整,文件都在 libexec/config/analysis-ik 下,如 main.dic 为主词典,stopword.dic 为停用词表。