Elasticsearch 基础教程

Elasticsearch 高级教程

Elasticsearch 插件

Elasticsearch 笔记

es 中文分词器详解(安装、使用、自定义词典等)


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_wordik_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 种:

  1. 自定义扩展词典;
  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 为停用词表。