Elasticsearch 中文分词器

IK 分词器

我们在ES中最常用的中文分词器就是IK分词器,其项目地址为:https://github.com/medcl/elasticsearch-analysis-ik

下载安装

  1. 下载地址: https://github.com/medcl/elasticsearch-analysis-ik/releases

  2. 下载时注意和es的版本对应,我们es版本为:8.6.2。所以我们下载 elasticsearch-analysis-ik-8.6.2.zip 解压包内容如下:
    在这里插入图片描述

  3. 在ES home/plugins 目录下创建目录 ik,并将我们下载下zip包解压到 es_home/plugins/ik 目录下

  4. 重启 ES 服务

使用

IK 分词器有如下方式使用:
analyzer 和 tokenizer 均可配置使用 ik 分词器,两种配置对应的值均为如下两个:

  • ik_smart (最粗粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”,适合 Phrase 查询)
  • ik_max_word(最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合,适合 Term Query)

ik_max_word 示例

{
  "analyzer" : "ik_max_word",
  "text" : "我们都是中国人"
}{
  "tokenizer" : "ik_max_word",
  "text" : "我们都是中国人"
}

解析结果:

{
    "tokens": [
        {
            "token": "我们",
            "start_offset": 0,
            "end_offset": 2,
            "type": "CN_WORD",
            "position": 0
        },
        {
            "token": "都是",
            "start_offset": 2,
            "end_offset": 4,
            "type": "CN_WORD",
            "position": 1
        },
        {
            "token": "中国人",
            "start_offset": 4,
            "end_offset": 7,
            "type": "CN_WORD",
            "position": 2
        },
        {
            "token": "中国",
            "start_offset": 4,
            "end_offset": 6,
            "type": "CN_WORD",
            "position": 3
        },
        {
            "token": "国人",
            "start_offset": 5,
            "end_offset": 7,
            "type": "CN_WORD",
            "position": 4
        }
    ]
}

ik_smart 示例

{
  "tokenizer" : "ik_smart",
  "text" : "我们都是中国人"
}

解析结果:

{
    "tokens": [
        {
            "token": "我们",
            "start_offset": 0,
            "end_offset": 2,
            "type": "CN_WORD",
            "position": 0
        },
        {
            "token": "都是",
            "start_offset": 2,
            "end_offset": 4,
            "type": "CN_WORD",
            "position": 1
        },
        {
            "token": "中国人",
            "start_offset": 4,
            "end_offset": 7,
            "type": "CN_WORD",
            "position": 2
        }
    ]
}

IK 分词器字典扩展

在 ik 的文件的 config 目录下有 ik 分词的配置文件(IKAnalyzer.cfg.xml)以及相关的 dic 字典文件。

IKAnalyzer.cfg.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
        <comment>IK Analyzer 扩展配置</comment>
        <!--用户可以在这里配置自己的扩展字典 -->
        <entry key="ext_dict"></entry>
         <!--用户可以在这里配置自己的扩展停止词字典-->
        <entry key="ext_stopwords"></entry>
        <!--用户可以在这里配置远程扩展字典 -->
        <!-- <entry key="remote_ext_dict">words_location</entry> -->
        <!--用户可以在这里配置远程扩展停止词字典-->
        <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>

注释说得很明确了,我们来总结一下就是 IK 支持两种扩展方式:

  1. 本地 dic 文件扩展
  2. 远程配置扩展

本地 dic 文件扩展

1. 在 ik 的 config 目录下创建我们的扩展词典文件:my_ext_dic.dic

在文件中添加我们要扩展的词

my_ext_dic.dic
科比布莱恩特

我们就加科比的名字吧

2. 修改 IKAnalyzer.cfg.xml 配置

IKAnalyzer.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
        <comment>IK Analyzer 扩展配置</comment>
        <!--用户可以在这里配置自己的扩展字典 -->
        <entry key="ext_dict">my_ext_dic.dic</entry>
         <!--用户可以在这里配置自己的扩展停止词字典-->
        <entry key="ext_stopwords"></entry>
        <!--用户可以在这里配置远程扩展字典 -->
        <!-- <entry key="remote_ext_dict">words_location</entry> -->
        <!--用户可以在这里配置远程扩展停止词字典-->
        <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>

  1. 重启 ES 服务
  2. 验证是否成功
{
  "tokenizer" : "ik_max_word",
  "text" : "NBA篮球巨星,科比布莱恩特中国行"
}

查看结果,最终的分词中一定会有“科比布莱恩特”这样完整的词语。

远程扩展字典

IKAnalyzer.cfg.xml 配置

 <!--用户可以在这里配置远程扩展字典 -->
 <!-- <entry key="remote_ext_dict">words_location</entry> -->
 <!--用户可以在这里配置远程扩展停止词字典-->
 <!-- <entry key="remote_ext_stopwords">words_location</entry> -->

words_location 需要替换为我们远程的url,比如:https://aaaa.com/dics

对远程url的要求

  1. http 请求需要返回两个 header,一个是 Last-Modified,一个是 ETag,这两者都是字符串类型,只要有一个发生变化,ik 插件就会去抓取新的分词进而更新词库。
  2. http 请求返回的内容格式是一行一个分词,换行符用 \n 即可。

使用nginx或其他web服务器提供字典扩展服务

  • 可以将字典放在 UTF-8 编码的 .txt 文件中,然后将文件放在web服务器中,当这个 .txt 文件更新时,ik 会自动获取并更新扩展词典。

远程扩展字典的方式无需重启 ES 服务,只是在字典管理上来说,扩展字段文件独立于 ES 服务了,在字典需要频繁修改等时候,我们还可以自定义一个管理端应用,动态的通过应用来修改。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值