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
注意本地文件路径的前缀 file:// 加上文件绝对路径。
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 目录下,具体配置结构如下:
<?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"></entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords"></entry>
<!--用户可以在这里配置远程扩展字典 -->
<!-- <entry key="remote_ext_dict">words_location</entry> -->
<!--用户可以在这里配置远程扩展停止词字典-->
<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>
当然,如果开发者认为 ik 默认的词表有问题,也可以进行调整,文件都在 libexec/config/analysis-ik 下,如 main.dic 为主词典,stopword.dic 为停用词表。