Py学习  »  Elasticsearch

【Elasticsearch】5. IK分词器

华Shampoo • 4 年前 • 485 次点击  
阅读 39

【Elasticsearch】5. IK分词器

标准Standard分词器

ES默认采用的标准分词器对于英文是单词分词,对于中文是单字分词,所以Standard分词器并不适用于中文的搜索。因此将分词器修改为对中文友好的分词,从而达到更佳搜索的效果。

IK分词器安装

  1. 下载地址:github.com/medcl/elast…

    20210812161523.png

    注意:IK分词器的版本必须与ES版本完全一致!

  2. 删除data文件夹

    因为IK分词器的安装需要保证原ES中没有任何数据,一般在ES正式使用前就需要安装IK分词器。

    20210812162707.png

  3. 在plugins目录中创建analyser-ik目录

  4. 将zip包解压到analyser-ik目录下

    20210812163407.png

  5. 重新启动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生效。

  1. 进入ES的plugins文件夹,找到IK分词器的根目录。

  2. 进入IK分词器目录中的config文件夹,找到IKAnalyzer.cfg.xml文件。

    20210815022739.png

    后缀.dic文件就是IK官方提供的各种字典。

  3. 进入该文件:

    扩展字典和扩展停止字典可供配置。

    20210815023259.png

    • 扩展字典:将关键词纳入IK分词器字典。

    • 扩展停止字典:在IK分词器字典中,但是让IK分词器故意忽略该关键词。

  4. 创建扩展字典文件

    文件名自定义,后缀必须为dic。

    一般情况下,扩展字典文件名为extension.dic,扩展停止字典文件名为stop.dic。

    20210815024119.png

  5. 在扩展字典文件中添加扩展词

    20210815024430.png

    注意:

    • 该扩展字典文件的文本格式必须是UTF-8。
    • 扩展字典和扩展停止字典中一行只能有一个词语。
  6. 扩展字典文件配置进IKAnalyzer.cfg.xml

    entry标签的key不变,标签中间填写扩展字典文件名,如果要配置多个扩展字典文件,文件名之间使用 ";" 分隔

    20210815024749.png

  7. 重新启动ES,加载扩展字典。

3. 远程添加扩展词

如果需要专门的来手动添加扩展词或者忽略扩展词,那么无疑大大增加了人工成本。

当前较为优秀的方案是,Redis对搜索词进行实时统计,每间隔一段时间将统计数据取出,通过程序分析每个词的流行程度,如果某个词较为流行而扩展字典中却没有,那么就是用文件IO流将这些关键词写入扩展字典中。ES实时监听扩展字典,如果发现扩展字典的内容出现变化,则重新加载词典进入ES。

流行的判定指标:

  • 所有搜索词汇中排名靠前的关键词。
  • 达到某一个预定搜索数量的关键词。

远程增加扩展词的方法为:创建一个专门用来存放关键词的txt文本文件,然后将该文件的访问地址配置到IKAnalyzer.cfg.xml。如果系统发现某个词较为流行了,就通过文件流将该关键词写入文本文件,通过ES对该扩展字典文件的实时监听就可以实现自动添加扩展词了。

下文只展示配置远程扩展字典的流程,并不会详细展示整个远程添加扩展词的解决方案,详细流程请见后续文章。

  1. 创建远程扩展字典txt文件

    该txt文件中规定存储的每一个关键词之间必须回车换行,格式和dic文件一致。

    该txt文件一般命名:扩展字典文件名为extension.txt,扩展停止字典文件名为stop.txt。

    该txt一般存放在项目中,例如在Spring Boot项目推荐放入webapp目录。

    20210816185043.png

  2. 设置SpringBoot项目上下文路径

    20210816190231.png

  3. 获得该远程扩展字典文件的访问地址:http://localhost:8080/es/extension.txt

  4. 将该远程字典地址配置进IKAnalyzer.cfg.xml

    20210816194452.png

  5. 重新启动ES,加载远程扩展字典。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/118605
 
485 次点击