天天看点

ElasticSearch:集成IK分词器以及基本使用

IK分词器的简单介绍

把一段中文划分成一个个的关键字,我们在搜索时候会把自己的语句进行分词,会把数据库中或者索引库中的数据进行分词,然后进行一个匹配操作 ,默认的中文分词是将每个字分成一个词。目前比较流行的是ik分词器是一个好用的中文分词器。

下载IK分词器

根据你的Es的版本来下载对应版本的IK,这里我使用的是7.16.2的ES,所以就下载ik-7.16.2.zip的文件(这种版本对应的整挺好)

​​​下载网址​​

​​ElasticSearch:简单介绍以及使用Docker部署ElasticSearch 和 Kibana​​

我以这篇博客为基础,在服务器新创建一个plugins文件夹,好放ik插件,然后挂载

mkdir -p /usr/local/elasticsearch/plugins/ik      

新创建的文件夹也要赋予用户操作权限

chmod -R 777 /usr/local/elasticsearch/plugins/ik      

使用xftp将文件拷贝到服务器的上述路径之后,解压

//解压
unzip elasticsearch-analysis-ik-7.16.2.zip
//完事之后,删除压缩包
rm -rf elasticsearch-analysis-ik-7.16.2.zip      

停止上面那篇博客创建的容器并删除

docker stop 容器ID/容器名
docker rm 容器ID/容器名      
ElasticSearch:集成IK分词器以及基本使用

重新创建容器服务运行

docker run -itd -p 9200:9200 -p 9300:9300 -p 5601:5601 \
-v /usr/local/elasticsearch/config/jvm.options:/home/elasticsearch/elasticsearch-7.16.2/config/jvm.options \
-v /usr/local/elasticsearch/config/elasticsearch.yml:/home/elasticsearch/elasticsearch-7.16.2/config/elasticsearch.yml \
-v /usr/local/elasticsearch/data:/home/elasticsearch/elasticsearch-7.16.2/data \
-v /usr/local/elasticsearch/plugins://home/elasticsearch/elasticsearch-7.16.2/plugins \
--name EsKibana  nshou/elasticsearch-kibana      

查看插件

http://IP:9200/_cat/plugins      
ElasticSearch:集成IK分词器以及基本使用

测试IK分词器

使用kibana的Dev Tools工具来测试IK分词器

http://IP:5601/app/dev_tools#/console      

IK提供了两种分词算法: ik_smart和ik_max_word

ik_smart:最少切分

请求一个分词器,填好分词要求

GET _analyze
{
  "analyzer": "ik_smart",
  "text": "搜索引擎"
}      

ik_max_word: 最多切分

GET _analyze
{
  "analyzer": "ik_max_word",
  "text": "搜索引擎"
}      

不过这也是看你输入的text来的,有时候最少切分和最多切分的结果差不多

ElasticSearch:集成IK分词器以及基本使用

像如下句子就切分得差不多,当是一个名词的时候,像上面那样好像就切分的区别大一些

GET _analyze
{
  "analyzer": "ik_smart",
  "text": "我来试试这个切分算法"
}

GET _analyze
{
  "analyzer": "ik_max_word",
  "text": "我来试试这个切分算法"
}      

自定义词典

分词算法毕竟是算法,不可能穷尽所有我们的需求。

有些我们自己的土话可能就不需要IK分词器将它分割开

如下例子不管使用那个算法都分开了

GET _analyze
{
  "analyzer": "ik_smart",
  "text": "三克油"
}

GET _analyze
{
  "analyzer": "ik_max_word",
  "text": "三克油"
}      

所以我们要自定义一个三克油的词来让IK分词器别把他们分割开了

在如下目录下有着相应的配置文件

plugins/ik/config      

下面.dic后缀的都是字典

ElasticSearch:集成IK分词器以及基本使用

我们随便进一个main.dic看看,可以看见都是词语

ElasticSearch:集成IK分词器以及基本使用

IKAnalyzer.cfg.xml 配置文件

我们修改这个配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
  <comment>IK Analyzer 扩展配置</comment>
  <!--用户可以在这里配置自己的扩展字典,对应着config目录下面的一个文档名,我这里定义为了ext_dict -->
  <entry key="ext_dict">ext_dict.dic</entry>
   <!--用户可以在这里配置自己的扩展停止词字典-->
  <entry key="ext_stopwords"></entry>
  <!--用户可以在这里配置远程扩展字典 -->
  <!-- <entry key="remote_ext_dict">words_location</entry> -->
  <!--用户可以在这里配置远程扩展停止词字典-->
  <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>      

并在config 这个目录下面新建一个ext_dict.dic文件

将自定义的词语放进去

ElasticSearch:集成IK分词器以及基本使用

修改文件之后,我们需要重启ElasticSearch

docker restart 容器ID/容器名      

再次使用kibana 的dev tools ,不管那个算法策略都有三克油这个词

GET _analyze
{
  "analyzer": "ik_smart",
  "text": "三克油"
}

GET _analyze
{
  "analyzer": "ik_max_word",
  "text": "三克油"
}      

继续阅读