ElasticSearch-安装中文分词ik

如果直接使用Elasticsearch的朋友在处理中文内容的搜索时,肯定会遇到很尴尬的问题——中文词语被分成了一个一个的汉字,当用Kibana作图的时候,按照term来分组,结果一个汉字被分成了一组。

这是因为使用了Elasticsearch中默认的标准分词器,这个分词器在处理中文的时候会把中文单词切分成一个一个的汉字,因此引入中文的分词器就能解决这个问题。

本篇文章按照下面的内容进行描述:

  • 分词器的作用
  • 安装IK
  • 简单的测试
  • 模拟测试
  • 安装elasticsearch-analysis-pinyin
  • 简单的测试
  • 模拟测试

分词器的作用

分词顾名思义,就是把一句话分成一个一个的词。这个概念在搜索中很重要,比如  This is a banana. 如果按照普通的空格来分词,分成 this, is, a, banana,的出来的 a其实对我们并没有什么用处。因此需要注意下面的问题:

  • 1 区分停顿词( a, or, and这种都属于停顿词)
  • 2 大小写转换( Bananabanana)
  • 3 时态的转换….

具体的算法可以参考http://tartarus.org/~martin/PorterStemmer/,对照的词语可以参考这里http://snowball.tartarus.org/algorithms/porter/diffs.txt

相比中文,就复杂的度了。因为中文不能单纯的依靠空格,标点这种进行分词。就比如 中华人民共和国国民,不能简单的分成一个词,也不能粗暴的分成 中华人民共和国国民人民中华这些也都算一个词!

因此常见的分词算法就是拿一个标准的词典,关键词都在这个词典里面。然后按照几种规则去查找有没有关键词,比如:

  • 正向最大匹配(从左到右)
  • 逆向最大匹配(从右到左)
  • 最少切分
  • 双向匹配(从左扫描一次,从右扫描一次)

IK,elasticsearch-analysis-ik提供了两种方式, ik_smart就是最少切分, ik_max_word则为细粒度的切分(可能是双向,没看过源码)

了解了分词器的背景后,就可以看一下如何在Elasticsearch重安装分词器了。

安装IK

github中下载相应的代码,比如我的最新版本2.4.0就没有对应的ik版本,不用担心,只需要修改pom.xml就可以了:


 

下载后,执行 mvn package,进行打包:

 

编译完成后,可以在target/releases目录下找到对应的zip包。

解压zip包,复制到elasticsearch-root-path/plugins/ik下即可。

 

拷贝后,重启elasticsearch就可以使用分词器了。

最简单的测试

这里使用_analyze api对中文段落进行分词,测试一下:

 

可以看到ik尽可能多的切分的单词:

 

如果使用ik_smart,则会尽可能少的返回词语: