Elasticsearch 7.X 中文分词器 ik 使用,及词库的动态扩展
一、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 使用,及词库的动态扩展相关推荐
- 如何在Elasticsearch中安装中文分词器(IK+pinyin)
如何在Elasticsearch中安装中文分词器(IK+pinyin) 如果直接使用Elasticsearch的朋友在处理中文内容的搜索时,肯定会遇到很尴尬的问题--中文词语被分成了一个一个的汉字,当 ...
- 本地elasticsearch中文分词器 ik分词器安装及使用
ElasticSearch 内置了分词器,如标准分词器.简单分词器.空白词器等.但这些分词器对我们最常使用的中文并不友好,不能按我们的语言习惯进行分词. ik分词器就是一个标准的中文分词器.它可以根据 ...
- 30_ElasticSearch IK分词器配置文件 以及自定义词库
ElasticSearch IK分词器配置文件 以及自定义词库 更多干货 分布式实战(干货) spring cloud 实战(干货) mybatis 实战(干货) spring boot 实战(干货) ...
- ElasticSearch 中文分词器ik的安装、测试、使用、自定义词库、热更新词库
文章目录 # 实验环境 # ik分词器的下载.安装.测试 ## 安装方法一:使用elasticsearch-plugin 安装 ## 安装方法二:下载编译好的包进行安装 1.下载 2.安装 3.重启` ...
- ElasticSearch中文分词器-IK分词器的使用
IK分词器的使用 首先我们通过Postman发送GET请求查询分词效果 GET http://localhost:9200/_analyze {"text":"农业银行& ...
- ElasticSearch 中的中文分词器该怎么玩?_03
内置分词器 ElasticSearch 核心功能就是数据检索,首先通过索引将文档写入 es.查询分析则主要分为两个步骤: 词条化:分词器将输入的文本转为一个一个的词条流. 过滤:比如停用词过滤器会从词 ...
- ElasticSearch 中的中文分词器以及索引基本操作详解
文章目录 1.ElasticSearch 分词器介绍 1.1 内置分词器 1.2 中文分词器 1.2.1 安装 1.2.2 测试 1.2.3 自定义扩展词库 1.2.3.1 本地自定义 1.2.3.2 ...
- ELK系列(十)、ES中文分词器IK插件安装和配置远程词库热加载
简介 IK Analyzer是一个开源的,基于Java语言开发的轻量级的中文分词工具包: 最初,它是以开源项目Luence 为应用主体的,结合词典分词和文法分析算法的中文分词组件:从 3.0 版本开始 ...
- solrcloud配置中文分词器ik
无论是solr还是luncene,都对中文分词不太好,所以我们一般索引中文的话需要使用ik中文分词器. 三台机器(192.168.1.236,192.168.1.237,192.168.1.238)已 ...
最新文章
- R语言scale_colour_brewer()函数和scale_fill_brewer()函数调色板及填充ggplot2图像实战
- tom启动报错:org.xml.sax.SAXParseException: Content is not allowed in prolog.
- 光滑噪声数据常用的方法_数据挖掘中常用的数据清洗方法
- 基于Ubuntu Server 16.04 LTS版本安装和部署Django之(一):安装Python3-pip和Django
- .NET中的加密类(对称加密)
- echart重新加载数据_在asp.net core中动态加载最新的配置信息
- php文件里搜索关键字,在PHP搜索脚本中突出显示关键字
- pdf417条形码开发
- HTTP请求返回415错误解决办法
- 8、ESP8266 深度睡眠
- Java代码常见错误写法
- 月入过万的外卖CPS红包小程序源码分享(附搭建教程)
- gpg4win使用教程_使用gpg4win生成密钥对
- VS2010/MFC编程入门教程之目录和总结(鸡啄米)
- 成功解决 failing shard [AccessControlException[access denied (“java.io.FilePermission“
- 决策树ID3代码(Python)
- 瞪羚企业申报流程材料
- Day53 Linux setitimer函数 信号集操作函数 信号捕捉 SIGCHLD信号
- 美国计算机科学就业率,美国计算机就业率最高的30所大学
- 揭秘eBay四大系统 从行为数据中寻找价值
热门文章
- 三星手机终于更新系统了,我的是s22u
- beats 耳机 android,Beats app安卓,Beats app安卓耳机管理预约 v2.3.5 - 游戏盒子下载站...
- 资金核对平台的发展历程
- Silverlight 2.5D RPG游戏技巧与特效处理:(十四)体感系统
- ARM中C语言和汇编语言互相调用以及实例
- 一个提升n倍效率的写作工具,我咋不知道?
- 妖人柴:都移动互联网时代了,为什么还要建网站?
- 【友盟】 微博分享缺少C8998文件
- mysql 存储树形结构
- 樊登读书会极致读后感_【学习部落】樊登读书会可复制的领导力感悟