当前位置: 首页 > news >正文

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

ElasticSearch 内置了分词器,如标准分词器、简单分词器、空白词器等。但这些分词器对我们最常使用的中文并不友好,不能按我们的语言习惯进行分词。

ik分词器就是一个标准的中文分词器。它可以根据定义的字典对域进行分词,并且支持用户配置自己的字典,所以它除了可以按通用的习惯分词外,我们还可以定制化分词。

ik分词器是一个插件包,我们可以用插件的方式将它接入到ES。

一、安装

1.1 下载

下载地址:ik分词器地址
注意要选择跟自己es保持一致的版本下载。
在这里插入图片描述

1.2解压

将下载的安装包在es安装目录下的plugins下新建一个ik文件夹、将文件解压。
在这里插入图片描述
在这里插入图片描述

1.3启动

启动成功之后可以看见ik插件已经运行
在这里插入图片描述
也可以通过当前命令查看插件是否安装。
在这里插入图片描述
插箱即用,到此ik分词器的安装就完成了。

二、使用IK分词器

IK分词器有两种分词模式:ik_max_word和ik_smart模式。
在这里插入图片描述

1、ik_max_word

会将文本做最细粒度的拆分,比如会将"曾舒琪董事长早上好"拆分为"曾、舒琪、董事长、董事、长、早上好、早上、上好"

GET /_analyze 
{"analyzer": "ik_max_word", // 最细粒度划分"text": "曾舒琪董事长早上好"
}

执行结果如下:

{"tokens" : [{"token" : "曾","start_offset" : 0,"end_offset" : 1,"type" : "CN_CHAR","position" : 0},{"token" : "舒琪","start_offset" : 1,"end_offset" : 3,"type" : "CN_WORD","position" : 1},{"token" : "董事长","start_offset" : 3,"end_offset" : 6,"type" : "CN_WORD","position" : 2},{"token" : "董事","start_offset" : 3,"end_offset" : 5,"type" : "CN_WORD","position" : 3},{"token" : "长","start_offset" : 5,"end_offset" : 6,"type" : "CN_CHAR","position" : 4},{"token" : "早上好","start_offset" : 6,"end_offset" : 9,"type" : "CN_WORD","position" : 5},{"token" : "早上","start_offset" : 6,"end_offset" : 8,"type" : "CN_WORD","position" : 6},{"token" : "上好","start_offset" : 7,"end_offset" : 9,"type" : "CN_WORD","position" : 7}]
}

2、ik_smart

会做最粗粒度的拆分,比如会将"曾舒琪董事长早上好"拆分成"曾、舒琪、董事长、早上好"

GET /_analyze
{"analyzer": "ik_smart",  // 最粗粒度划分"text": "曾舒琪董事长早上好"
}

执行结果如下:

{"tokens" : [{"token" : "曾","start_offset" : 0,"end_offset" : 1,"type" : "CN_CHAR","position" : 0},{"token" : "舒琪","start_offset" : 1,"end_offset" : 3,"type" : "CN_WORD","position" : 1},{"token" : "董事长","start_offset" : 3,"end_offset" : 6,"type" : "CN_WORD","position" : 2},{"token" : "早上好","start_offset" : 6,"end_offset" : 9,"type" : "CN_WORD","position" : 3}]
}

这就是ik分词器两种简单的使用模式

问题

我们使用这两种模式,想让ik分词器把名词进行一个拆开划分,但是有一个问题,曾舒琪这明显就是一个人名,两种模式都并没有把这个词汇拆开到一起

解决方法

其实ik分词器给我们提供了一系列的词典,我们只需要添加一个自己的词典。

1、找到config目录下的xml配置文件
在这里插入图片描述
2、这里我们需要添加我们自己的词典。其实所谓词典就是创建一个名称后缀以dict结尾的文件。
在这里插入图片描述
3、这里我添加了一个shipley_zeng.dict的词典
在这里插入图片描述
4、那这个词典哪里来的呢?凭空出现吗?我们返回上一级目录。可以看见有很多词典、我们随便打开一个看看。
在这里插入图片描述
看看这个main.dict
在这里插入图片描述
可以看见这边有特别多的词汇、这些词汇在实际的应用开发过程当中肯定是不够用的、我们要创建一个属于我们自己的词典。

5、创建一个自己的词典到config目录下,名字跟上面提到的一样叫做shipley_zeng.dict
在这里插入图片描述
内容如下,这边我们要注意一下编码格式为UTF-8
在这里插入图片描述
6、加入这个词典后我们在重新启动es,可以看见已经成功的加载了我们创建的词典
在这里插入图片描述
7、我们在使用 ik_max_word 最细粒度查询看看效果

GET /_analyze 
{"analyzer": "ik_max_word", // 最细粒度划分"text": "曾舒琪董事长早上好"
}

执行结果如下:

{"tokens" : [{"token" : "曾舒琪","start_offset" : 0,"end_offset" : 3,"type" : "CN_WORD","position" : 0},{"token" : "舒琪","start_offset" : 1,"end_offset" : 3,"type" : "CN_WORD","position" : 1},{"token" : "董事长","start_offset" : 3,"end_offset" : 6,"type" : "CN_WORD","position" : 2},{"token" : "董事","start_offset" : 3,"end_offset" : 5,"type" : "CN_WORD","position" : 3},{"token" : "长","start_offset" : 5,"end_offset" : 6,"type" : "CN_CHAR","position" : 4},{"token" : "早上好","start_offset" : 6,"end_offset" : 9,"type" : "CN_WORD","position" : 5},{"token" : "早上","start_offset" : 6,"end_offset" : 8,"type" : "CN_WORD","position" : 6},{"token" : "上好","start_offset" : 7,"end_offset" : 9,"type" : "CN_WORD","position" : 7}]
}

8、使用 ik_smart 最粗粒度查询看看效果

GET /_analyze
{"analyzer": "ik_smart",  // 最粗粒度划分"text": "曾舒琪董事长早上好"
}

执行结果如下:

{"tokens" : [{"token" : "曾舒琪","start_offset" : 0,"end_offset" : 3,"type" : "CN_WORD","position" : 0},{"token" : "董事长","start_offset" : 3,"end_offset" : 6,"type" : "CN_WORD","position" : 1},{"token" : "早上好","start_offset" : 6,"end_offset" : 9,"type" : "CN_WORD","position" : 2}]
}

9、我们可以看见、现在不管使用ik_max_word还是ik_smart,他都能将曾舒琪这个词汇拆开组合,达到了我们所需要的诉求。
在这里插入图片描述

总结

以上就是本地elasticsearch中文分词器 ik分词器及使用,希望对刚刚接触es的小伙伴有所帮助,谢谢,如有疑问请随时联系我。

http://www.lryc.cn/news/64149.html

相关文章:

  • Java 中的异常处理机制是什么?如何使用它来处理程序中的异常?(七)
  • 基于UDQ的并网单相逆变器控制【同步参考系下单相并网全桥正弦PWM逆变器闭环控制】(Simulink)
  • JAVA开发——常用的注解
  • 【Java笔试强训 24】
  • SpringCloud详解
  • 如何保障网络安全
  • 网络基础:socket套接字
  • 程序员如何学好PHP?做好这五个方面就够了
  • 【开源项目】Build your own X 构建自己的项目
  • 在.NET Core中正确使用HttpClient的方式
  • 【C++】位运算类题目总结
  • Node服务端开发【NPM】
  • Doris(21):Doris的函数—日期函数
  • 和月薪5W的阿里程序员聊过后,才知道自己一直在打杂...
  • 西门子PLC沿脉冲类指令汇总
  • 软件多语言文案脚本自动化方案
  • C++017-C++文件读写应用
  • 计算机网络 实验二
  • Unity 3D 学习笔记(1)
  • P1050 [NOIP2005 普及组] 循环
  • 软考算法-排序篇-上
  • 总结836
  • ginbuilder 工具快速创建
  • 【Java基础面试宝典】堆、栈、方法区分别都存储了那些内容?wait 和 sleep 方法的区别?
  • 古剑飞仙手游Linux系统服务器架设教程
  • python实战应用讲解-【numpy数组篇】常用函数(十)(附python示例代码)
  • 计算机组成原理(考研408)练习题#2
  • Apache POI,springboot中导出excel报表
  • CSS(一)-- 三种样式表
  • 嵌入式之Samba服务器搭建