标准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,加载远程扩展字典。 






















![[桜井宁宁]COS和泉纱雾超可爱写真福利集-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/4d3cf227a85d7e79f5d6b4efb6bde3e8.jpg)

![[桜井宁宁] 爆乳奶牛少女cos写真-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/d40483e126fcf567894e89c65eaca655.jpg)
