一、ik中文分词器

上篇文章我们学习了ES集群分片和水平扩容,前面再使用的时候应该就会发现,在做match 匹配时,默认会进行分词,但当查询内容是中文时,分词效果是一个字被认定了一个词,这显然不符合我们对中文分词的效果,因此本篇我们讲解下ES中中文分词器ik 的使用。

上篇文章地址:https://blog.csdn.net/qq_43692950/article/details/122246286

ik是基于java开发的轻量级的中文分词工具包。它是以开源项目Luence为主体的,结合词典分词和文法分析算法的中文分词组件,下面是ik的Github地址:

https://github.com/medcl/elasticsearch-analysis-ik

官方提供的 ik 和 ES的对应版本关系:

ik 的分词粒度:

  • ik_max_word:会将文本做最细粒度(拆到不能再拆)的拆分,例如「中华人民共和国国歌」会被拆分为「中华人民共和国、中华人民、中华、华人、人民共和国、人民、人、民、共和国、共和、和、国国、国歌」,会穷尽各种可能的组合
  • ik_smart:会将文本做最粗粒度(能一次拆分就不两次拆分)的拆分,例如「中华人民共和国国歌」会被拆分为「中华人民共和国、国歌」

二、ES安装ik

首先需要ik包,下载地址:

https://github.com/medcl/elasticsearch-analysis-ik/releases

我们选用的是ES 7.140 版本的,所以这里要下载 7.14.0 的 ik:


下载完成后,新建ik目录,并将解压后的文件放在ik目录下:

下面将ik 目录复制到es安装目录的 plugins 目录下:

重新启动 es:

可以看到已经自动加载ik的配制。

三、测试中文分词

ik_max_word 细粒度分词

使用PostMan 向ES服务器 发送Get请求:

http://localhost:9200/_analyze

请求体内容:

{"text": "人民共和国","analyzer":"ik_max_word"
}


已经不是以前的一个中文就是一个词了,下面再测试下 ik_smart 的效果:

ik_smart 粗粒度分词


现在就已经成功使用了,ik中文分词器。

四、ik 扩展词汇

上面已经使用了ik分词器,已经有了分词效果,但是再对一些名词进行分词时,会怎么样的,如果测试下:德玛西亚 这个词,我们希望作为一个整体分词,下面看下结果:

可以看到将德玛西亚 这个词给分开了,这是由于Ik自带的分词库中并没有这个名词,所以就不知道怎么分了,此时,我们就可以进行扩展词汇:

首先进入es安装目录,进入plugins\ik\config 目录下,创建 custom.dic 文件,内容我们写入:德玛西亚

在这里插入图片描述

下面修改plugins\ik\config\IKAnalyzer.cfg.xml文件:

下面重启es,

可以看到已经加载我们自定义的词汇。

下面再来做上面的请求:

已经分词出了德玛西亚这个词语。

五、远程动态词库

上面已经实现对词库的扩展,但是会发现一个弊端,就是一旦扩展后就需要重启es使扩展词汇生效,如果使生产环境怎么能随便对es进行重启呢,对此es提供了远程词汇的方式,我们对远程词汇文件进行修改,es每次都以http请求的方式获取分词,但要符合两个条件:

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

满足上面两点要求就可以实现热更新分词了,不需要重启 ES 实例。

对此,官方也给出了方案,就是将分词文件放在nginx中,当文件被修改nginx自动返回相应的 Last-Modified 和 ETag:

下面我们根据官方的方案进行实现下,首先新建一个 ik_dict.txt ,写入以下内容:

德玛西亚
弗雷尔卓德
小毕超

然后将该文件放在nginx的静态资源目录下:

然后启动nginx,访问http://192.168.40.167:8080/ik_dict.txt,注意修改为自己的ip:

然后修改es安装目录下 /plugins/ik/config/IKAnalyzer.cfg.xml文件:

然后重启es,测试效果:

由于我们在远程库中配制了小毕超所以这里可以分析出来。

下面测试下没有配制的词语,比如果粒橙这个词语:

现在是一个字算了一个词语,下面我们修改ik_dict.txt文件:

再来请求下:

此时就实现了,无需重启es,热更新词库的效果了。

六、扩展 - 更新历史索引

上面已经实现了动态词库的效果,上面使用的都是直接使用分词器进行测试的,在实际使用中不可能这样做的,都是去查询数据的,所以这里就会出现一个问题。

在我们自定义拓展词库更改后,在原先的索引文档中,由于不是新插入的数据,所以其倒排索引列表还是原先的分词列表数据,导致就算拓展了词库,新增的分词也没有生效。在不重新导入数据的前提下,处理办法如下:

通过_update_by_query去更新匹配的文档,如果没有指定查询,那么就会在每个文档上执行更新:

向es服务器发送POST请求:

 http://127.0.0.1:9200/user/_update_by_query?conflicts=proceed

其中user为索引名称,conflicts表示如果更新过程中发生异常冲突时如何处理,有两种方案:

  • abort:中止(默认)
  • proceed:继续执行

注意更新索引,会影响线上的es的 qps,尽量选择夜深人静的时候进行更新。


喜欢的小伙伴可以关注我的个人微信公众号,获取更多学习资料!

Elasticsearch 7.X 中文分词器 ik 使用,及词库的动态扩展相关推荐

  1. 如何在Elasticsearch中安装中文分词器(IK+pinyin)

    如何在Elasticsearch中安装中文分词器(IK+pinyin) 如果直接使用Elasticsearch的朋友在处理中文内容的搜索时,肯定会遇到很尴尬的问题--中文词语被分成了一个一个的汉字,当 ...

  2. 本地elasticsearch中文分词器 ik分词器安装及使用

    ElasticSearch 内置了分词器,如标准分词器.简单分词器.空白词器等.但这些分词器对我们最常使用的中文并不友好,不能按我们的语言习惯进行分词. ik分词器就是一个标准的中文分词器.它可以根据 ...

  3. 30_ElasticSearch IK分词器配置文件 以及自定义词库

    ElasticSearch IK分词器配置文件 以及自定义词库 更多干货 分布式实战(干货) spring cloud 实战(干货) mybatis 实战(干货) spring boot 实战(干货) ...

  4. ElasticSearch 中文分词器ik的安装、测试、使用、自定义词库、热更新词库

    文章目录 # 实验环境 # ik分词器的下载.安装.测试 ## 安装方法一:使用elasticsearch-plugin 安装 ## 安装方法二:下载编译好的包进行安装 1.下载 2.安装 3.重启` ...

  5. ElasticSearch中文分词器-IK分词器的使用

    IK分词器的使用 首先我们通过Postman发送GET请求查询分词效果 GET http://localhost:9200/_analyze {"text":"农业银行& ...

  6. ElasticSearch 中的中文分词器该怎么玩?_03

    内置分词器 ElasticSearch 核心功能就是数据检索,首先通过索引将文档写入 es.查询分析则主要分为两个步骤: 词条化:分词器将输入的文本转为一个一个的词条流. 过滤:比如停用词过滤器会从词 ...

  7. ElasticSearch 中的中文分词器以及索引基本操作详解

    文章目录 1.ElasticSearch 分词器介绍 1.1 内置分词器 1.2 中文分词器 1.2.1 安装 1.2.2 测试 1.2.3 自定义扩展词库 1.2.3.1 本地自定义 1.2.3.2 ...

  8. ELK系列(十)、ES中文分词器IK插件安装和配置远程词库热加载

    简介 IK Analyzer是一个开源的,基于Java语言开发的轻量级的中文分词工具包: 最初,它是以开源项目Luence 为应用主体的,结合词典分词和文法分析算法的中文分词组件:从 3.0 版本开始 ...

  9. solrcloud配置中文分词器ik

    无论是solr还是luncene,都对中文分词不太好,所以我们一般索引中文的话需要使用ik中文分词器. 三台机器(192.168.1.236,192.168.1.237,192.168.1.238)已 ...

最新文章

  1. R语言scale_colour_brewer()函数和scale_fill_brewer()函数调色板及填充ggplot2图像实战
  2. tom启动报错:org.xml.sax.SAXParseException: Content is not allowed in prolog.
  3. 光滑噪声数据常用的方法_数据挖掘中常用的数据清洗方法
  4. 基于Ubuntu Server 16.04 LTS版本安装和部署Django之(一):安装Python3-pip和Django
  5. .NET中的加密类(对称加密)
  6. echart重新加载数据_在asp.net core中动态加载最新的配置信息
  7. php文件里搜索关键字,在PHP搜索脚本中突出显示关键字
  8. pdf417条形码开发
  9. HTTP请求返回415错误解决办法
  10. 8、ESP8266 深度睡眠
  11. Java代码常见错误写法
  12. 月入过万的外卖CPS红包小程序源码分享(附搭建教程)
  13. gpg4win使用教程_使用gpg4win生成密钥对
  14. VS2010/MFC编程入门教程之目录和总结(鸡啄米)
  15. 成功解决 failing shard [AccessControlException[access denied (“java.io.FilePermission“
  16. 决策树ID3代码(Python)
  17. 瞪羚企业申报流程材料
  18. Day53 Linux setitimer函数 信号集操作函数 信号捕捉 SIGCHLD信号
  19. 美国计算机科学就业率,美国计算机就业率最高的30所大学
  20. 揭秘eBay四大系统 从行为数据中寻找价值

热门文章

  1. 三星手机终于更新系统了,我的是s22u
  2. beats 耳机 android,Beats app安卓,Beats app安卓耳机管理预约 v2.3.5 - 游戏盒子下载站...
  3. 资金核对平台的发展历程
  4. Silverlight 2.5D RPG游戏技巧与特效处理:(十四)体感系统
  5. ARM中C语言和汇编语言互相调用以及实例
  6. 一个提升n倍效率的写作工具,我咋不知道?
  7. 妖人柴:都移动互联网时代了,为什么还要建网站?
  8. 【友盟】 微博分享缺少C8998文件
  9. mysql 存储树形结构
  10. 樊登读书会极致读后感_【学习部落】樊登读书会可复制的领导力感悟