ElasticSearch中使用IK分词器
IK分词器是es的一个插件。我们知道只有通过适当的分词,才能查询到有意义的内容。例如:搜索“你好寒冰之光”,我们希望包含“你好”、“寒冰之光”的内容被搜索出来,而不是把所有包含“你”、“好”、“寒”、“冰”、“之”、“光”的内容都搜素出来,因为只有搜索所有意义的词,才是正确的。分词器就是来做分词的,而IK是咱们中国人开发的分词器,也是目前最流行的分词器。
1、到github上下载最新的IK分词器:https://github.com/medcl/elasticsearch-analysis-ik
2、将zip文件解压缩到es的plugins目录即可,改个名叫ik:
3、config目录下保存的就是全部的分词配置,随便打开一个.dic文件看看,你会发现里面保存的内容其实就是我们认为有意义的词,得有好几十万个:
4、重启一下es,让它加载ik。访问http://localhost:9100/,我们通过elasticsearch-head来搜索一下试试。我们来搜索“你好寒冰之光”这句话,看看它会怎么分词。在查询框里输入http://localhost:9200/_analyze/,表示我们要做一下分析;post内容输入{"analyzer":"ik_smart","text":"你好寒冰之光"},表示分析使用ik_smart(聪明分词方式,还有一种是ik_max_word,表示最大化分词,即尽可能把词语分拆得很细)。要分析的内容是“你好寒冰之光”。提交请求:
我们发现ik返回的分词结果是“你好”、“寒冰”、“之光”。这说明它没有把“寒冰之光”当成是一个有意义的词。我想大家都想到了,因为我们就没有把“寒冰之光”这个词定义出来,所以ik当然就不知道了。那么,我们来试着自定义一下:
5、在config目录下,新建一个文件custom.dic(名字可以自己指定)。我们把“寒冰之光”几个字放进去,保存。
6、修改配置文件IKAnalyzer.cfg.xml,把我们自定义的文件配置上:
7、重启es,我们再试试:
这次发现ik返回的词条是“你好”、“寒冰之光”。说明它已经知道“寒冰之光”是一个词了。
8、我们再来看看ik_max_word模式下,ik会怎样分词:
可以看到分成了4个词语。这两种模式下,分词的策略是不同的,具体用哪种,取决于我们自己的需要。