一、什么是分词
平常我们在使用百度或者谷歌进行搜索的时候,通常输入的不是某个准确的词或者单个字,而是一个短语或是一句话。比如我在百度中搜索:“如何评价ElasticSearch”:
可以看到,搜索引擎并不是去检索完全匹配“如何评价ElasticSearch”或者简单的模糊查询,而是将短语拆分成了“ElasticSearch”、“评价”等词语,然后根据一定的规则将相关度比较高的结果显示出来。
因此,分词也是我们进行全文检索的关键。
二、ik分词器
es提供的默认中文分词会将所有的中文字拆分成一个个单字,就像这样:
这并不是我们想要的结果,所以我们需要借助ik分词器对短语进行分词。
ik分词器这个插件的具体安装在我的上一篇博客中可以找到:博客链接,这里就不再赘述了。
ik分词器提供了两种分词算法,分别是ik_smart(智能分词、最粗粒度分词)和ik_max_word(最细粒度分词)。
在kibana上分别对两种算法进行测试:
1、ik_smart:
GET _analyze
{
"analyzer": "ik_smart",
"text": "我爱中华民族"
}
2、ik_max_word:
GET _analyze
{
"analyzer": "ik_max_word",
"text": "我爱中华民族"
}
可以看到,在ik_smart下,“中华民族”会作为一个完整的词语,而在ik_max_word下,“中华民族”会被切分成“中华”、“民族”等更细粒度的词语。
因此我们在索引时用ik_max_word,在搜索时用ik_smart,这个在以后的实战检索时,会做更详细的解释。
*自定义分词词典
ik分词器实现分词主要依赖于其config目录下的字典,ik会根据字典中所包含的词语对输入的文本进行分词,因此如果出现了在字典中所没有的词语,那么就会出现如下的情况:
哔哩哔哩是某视频网站的名称,由于在分词器的字典中并不包含“哔哩哔哩”这个词语,因此即使在智能分词,也就是最粗粒度分词的情况下,它也被分成了4个单字。如果想解决这个问题,就需要我们自己将词语放到字典中:
进入到ik的config目录下,可以看到许多以.dic结尾的文件,这些文件就是ik分词器默认的字典:
打开某个字典,可以看到每行都是一个独立的词语,我们之前输入的“中华民族”也赫然在列:
我们可以仿照这种配置方法,新建自定义的字典,将词语放进去:
然后我们需要在IKAnalyzer.cfg.xml文件中,引入我们的字典:
保存之后,我们需要把es和kibana都重启一下,重启es时,我们可以在控制台看到我们的my.dic被加载了:
重启完成之后,在kibana上测试一下,现在,哔哩哔哩就被当作了一个完整的词语了!