标准Standard分词器
ES默认采用的标准分词器对于英文是单词分词,对于中文是单字分词,所以Standard分词器并不适用于中文的搜索。因此将分词器修改为对中文友好的分词,从而达到更佳搜索的效果。
IK分词器安装
-
注意:IK分词器的版本必须与ES版本完全一致!
-
删除data文件夹
因为IK分词器的安装需要保证原ES中没有任何数据,一般在ES正式使用前就需要安装IK分词器。
-
在plugins目录中创建analyser-ik目录
-
将zip包解压到analyser-ik目录下
-
重新启动ES
两种安装方式区别
本文采用的安装方式是本地安装,IK分词器还可以在线安装,本地安装和在线安装的配置目录是不一样的,如果两个配置目录同时存在,则ES会默认采用在线安装配置路径中的配置文件,因为在线安装的配置文件路径是ES的默认配置文件路径。
- 本地安装的配置文件路径:ES安装目录/plugins/analyser-ik/config/IKAnalyzer.cfg.xml(如上)
- 在线安装的配置文件路径:ES安装目录/config/analysis-ik/IKAnalyzer.cfg.xml
以下所有对IK分词器的配置,都在本地安装的配置文件中配置。
两种分词模式
IK分词器提供了两种分词模式
-
ik_smart:会做最粗粒度的拆分,比如会将 "中华人民共和国国歌" 拆分为 "中华人民共和国,国歌" 。
测试:
GET /_analyze { "text": "中华人民共和国国歌", "analyzer": "ik_smart" } 复制代码
-
ik_max_word:会将文本做最细粒度的拆分,比如会将 "中华人民共和国国歌" 拆分为 "中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌",会穷尽各种可能的组合。
测试:
GET /_analyze { "text": "中华人民共和国国歌", "analyzer": "ik_max_word" } 复制代码
测试分词结果
下方命令的含义为:查看ik_max_word分词模式对文本 "中华人民共和国国歌" 的分词结果。
GET /_analyze
{
"text": "中华人民共和国国歌",
"analyzer": "ik_max_word"
}
复制代码
IK分词器使用
1. 指定分词模式
在创建Type时,就需要对text类型的字段进行分词模式的设置,如果不设置,默认为Standard标准分词器。
PUT /postilhub
{
"mappings": {
"user": {
"properties": {
"id": {
"type": "keyword"
},
"username": {
"type": "keyword"
},
"age": {
"type": "integer"
},
"content": {
"type": "text",
"analyzer": "ik_max_word"
}
}
}
}
}
复制代码
ES存储数据和索引数据时都依赖分词器,存储时设置的分词器必须和检索时使用的分词模式一致,如果不设置检索时使用的分词模式,ES默认设置为存储时设置的分词器。
PUT /postilhub
{
"mappings": {
"user": {
"properties": {
"id": {
"type": "keyword"
},
"username": {
"type": "keyword"
},
"age": {
"type": "integer"
},
"content": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word"
}
}
}
}
}
复制代码
2. 添加扩展词
IK分词器既然可以实现细粒度的拆分,那么能够准确的识别一个句子中所有词语的能力是十分重要的。但是随着互联网的发展,每天都会有新的网络词汇诞生,例如:"蓝廋香菇","奥里给","emo"...... IK分词器在处理这些网络新词时就非常受限了。
所以我们需要在IK分词器的基础上,自定义新的扩展词。
建议在IK分词器配置初始就预先设置大部分的扩展字典和扩展停止字典,因为新增扩展词只对后续的Document生效,不对之前的Document生效。
-
进入ES的plugins文件夹,找到IK分词器的根目录。
-
进入IK分词器目录中的config文件夹,找到IKAnalyzer.cfg.xml文件。
后缀.dic文件就是IK官方提供的各种字典。
-
进入该文件:
扩展字典和扩展停止字典可供配置。
-
扩展字典:将关键词纳入IK分词器字典。
-
扩展停止字典:在IK分词器字典中,但是让IK分词器故意忽略该关键词。
-
-
创建扩展字典文件
文件名自定义,后缀必须为dic。
一般情况下,扩展字典文件名为extension.dic,扩展停止字典文件名为stop.dic。
-
在扩展字典文件中添加扩展词
注意:
- 该扩展字典文件的文本格式必须是UTF-8。
- 扩展字典和扩展停止字典中一行只能有一个词语。
-
扩展字典文件配置进IKAnalyzer.cfg.xml
entry标签的key不变,标签中间填写扩展字典文件名,如果要配置多个扩展字典文件,文件名之间使用 ";" 分隔
-
重新启动ES,加载扩展字典。
3. 远程添加扩展词
如果需要专门的来手动添加扩展词或者忽略扩展词,那么无疑大大增加了人工成本。
当前较为优秀的方案是,Redis对搜索词进行实时统计,每间隔一段时间将统计数据取出,通过程序分析每个词的流行程度,如果某个词较为流行而扩展字典中却没有,那么就是用文件IO流将这些关键词写入扩展字典中。ES实时监听扩展字典,如果发现扩展字典的内容出现变化,则重新加载词典进入ES。
流行的判定指标:
- 所有搜索词汇中排名靠前的关键词。
- 达到某一个预定搜索数量的关键词。
远程增加扩展词的方法为:创建一个专门用来存放关键词的txt文本文件,然后将该文件的访问地址配置到IKAnalyzer.cfg.xml。如果系统发现某个词较为流行了,就通过文件流将该关键词写入文本文件,通过ES对该扩展字典文件的实时监听就可以实现自动添加扩展词了。
下文只展示配置远程扩展字典的流程,并不会详细展示整个远程添加扩展词的解决方案,详细流程请见后续文章。
-
创建远程扩展字典txt文件
该txt文件中规定存储的每一个关键词之间必须回车换行,格式和dic文件一致。
该txt文件一般命名:扩展字典文件名为extension.txt,扩展停止字典文件名为stop.txt。
该txt一般存放在项目中,例如在Spring Boot项目推荐放入webapp目录。
-
设置SpringBoot项目上下文路径
-
获得该远程扩展字典文件的访问地址:http://localhost:8080/es/extension.txt
-
将该远程字典地址配置进IKAnalyzer.cfg.xml
-
重新启动ES,加载远程扩展字典。