社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Elasticsearch

【Elasticsearch】5. IK分词器

华Shampoo • 3 年前 • 471 次点击  
阅读 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
 
471 次点击