ES7学习笔记(七)IK中文分词器
在上一节中,我们给大家介绍了ES的分析器,我相信大家对ES的全文搜索已经有了深刻的印象。分析器包含3个部分:字符过滤器、分词器、分词过滤器。在上一节的例子,大家发现了,都是英文的例子,是吧?因为ES是外国人写的嘛,中国如果要在这方面赶上来,还是需要屏幕前的小伙伴们的~
英文呢,我们可以按照空格将一句话、一篇文章进行分词,然后对分词进行过滤,最后留下有意义的词。但是中文怎么分呢?中文的一句话是没有空格的,这就要有一个强大的中文词库,当你的内容中出现这个词时,就会将这个词提炼出来。这里大家也不用重复造轮子,经过前辈的努力,这个中文的分词器已经有了,它就是今天要给大家介绍的IK中文分词器。
IK中文分词器的安装
ES默认是没有IK中文分词器的,我们要将IK中文分词器作为一个插件安装到ES中,安装的步骤也很简单:
- 从GitHub上下载适合自己ES版本的IK中文分词器,地址如下:
https://github.com/medcl/elasticsearch-analysis-ik/releases
。 -
在我们的ES的插件目录中(
${ES_HOME}/plugins
)创建ik
目录,mkdir ik
- 将我们下载好的IK分词器解压到
ik
目录,这里我们安装unzip
命令,进行解压。 - 重启我们所有的ES服务。
到这里,我们的IK中文分词器就安装完了。
IK中文分词器初探
在上一节我们访问了ES的分析器接口,指定了分析器和文本的内容,我们就可以看到分词的结果。那么既然我们已经安装了Ik中文分词器,当然要看一下效果了。在看效果之前,我们先要说一下,IK中文分词器插件给我们提供了两个分析器。
- ik_max_word: 会将文本做最细粒度的拆分
- ik_smart:会做最粗粒度的拆分
我们先看看ik_max_word
的分析效果吧,
POST _analyze { "analyzer": "ik_max_word", "text": "中华人民共和国国歌" }
我们指定分词器为ik_max_word
,文本内容为中华人民共和国国歌
。我们看一下分词的结果:
{ "tokens": [ { "token": "中华人民共和国", "start_offset": 0, "end_offset": 7, "type": "CN_WORD", "position": 0 }, { "token": "中华人民", "start_offset": 0, "end_offset": 4, "type": "CN_WORD", "position": 1 }, { "token": "中华", "start_offset": 0, "end_offset": 2, "type": "CN_WORD", "position": 2 }, { "token": "华人", "start_offset": 1, "end_offset": 3, "type": "CN_WORD", "position": 3 }, { "token": "人民共和国", "start_offset": 2, "end_offset": 7, "type": "CN_WORD", "position": 4 }, { "token": "人民", "start_offset": 2, "end_offset": 4, "type": "CN_WORD", "position": 5 }, { "token": "共和国", "start_offset": 4, "end_offset": 7, "type": "CN_WORD", "position": 6 }, { "token": "共和", "start_offset": 4, "end_offset": 6, "type": "CN_WORD", "position": 7 }, { "token": "国", "start_offset": 6, "end_offset": 7, "type": "CN_CHAR", "position": 8 }, { "token": "国歌", "start_offset": 7, "end_offset": 9, "type": "CN_WORD", "position": 9 } ] }
我们可以看到,分词分的非常细,我们在使用上面的这些进行搜索时,都可以搜索到中华人民共和国国歌
这个文本。我们再看一下另外一个分析器ik_smart
,
POST _analyze { "analyzer": "ik_smart", "text": "中华人民共和国国歌" }
我们的文本内容同样是中华人民共和国国歌
,看一下分词的效果,
{ "tokens": [ { "token": "中华人民共和国", "start_offset": 0, "end_offset": 7, "type": "CN_WORD", "position": 0 }, { "token": "国歌", "start_offset": 7, "end_offset": 9, "type": "CN_WORD", "position": 1 } ] }
同样的文本,使用ik_smart
进行分词时,只分成了两个词,和ik_max_word
分词器比少了很多。这就是两个分词器的区别,不过这两个分析器都是可以对中文进行分词的。
创建索引时指定IK分词器
既然我们安装了IK中文分词器的插件,那么我们在创建索引时就可以为text
类型的字段指定IK中文分词器了。来看看下面的例子,
PUT ik_index { "mappings": { "properties": { "id": { "type": "long" }, "title": { "type": "text", "analyzer": "ik_max_word" } } } }
我们创建了索引ik_index
,并且为字段title
指定了分词器ik_max_word
。我们执行一下,创建成功。然后我们再通过GET
请求看一下这个索引的映射情况。
GET ik_index/_mapping
返回的结果如下:
{ "ik_index": { "mappings": { "properties": { "id": { "type": "long" }, "title": { "type": "text", "analyzer": "ik_max_word" } } } } }
我们可以看到title
字段的分析器是ik_max_word
。
为索引指定默认IK分词器
在上一节中,我们已经给大家介绍了为索引指定默认分词器的方法,这里我们直接把分词器改为IK分词器就可以了,如下:
PUT ik_index { "settings": { "analysis": { "analyzer": { "default": { "type": "ik_max_word" } } } } }
这样我们在索引中就不用创建每一个字段,可以通过动态字段映射,将String
类型的字段映射为text
类型,同时分词器指定为ik_max_word
。我们试一下,向ik_index
索引中添加一条记录。
POST ik_index/_doc/1 { "id": 1, "title": "大兴庞各庄的西瓜", "desc": "大兴庞各庄的西瓜真是好吃,脆沙瓤,甜掉牙" }
执行成功。我们再执行搜索试一下,如下:
POST ik_index/_search { "query": { "match": { "title": "西瓜" } } }
我们搜索title
字段匹配西瓜
,执行结果如下:
{ "took": 2, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 1, "relation": "eq" }, "max_score": 0.2876821, "hits": [ { "_index": "ik_index", "_type": "_doc", "_id": "1", "_score": 0.2876821, "_source": { "id": 1, "title": "大兴庞各庄的西瓜", "desc": "大兴庞各庄的西瓜真是好吃,脆沙瓤,甜掉牙" } } ] } }
我们可以看到刚才插入的那条记录已经搜索出来了,看来我们的IK中文分词器起作用了,而且搜索的结果也符合我们的预期。我们再看看搜索西
一个字的时候,能不能搜索到结果,
POST ik_index/_search { "query": { "match": { "title": "西" } } }
执行结果如下:
{ "took": 4, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 0, "relation": "eq" }, "max_score": null, "hits": [] } }
并没有搜索出结果,说明在进行分词时,西瓜
是作为一个词出现的,并没有拆分成每一个字,这也是符合我们预期的。
好了~ 这一节的IK中文分词器就给大家介绍到这里了~~

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
ES7学习笔记(六)分析器
在前面的章节中,我们给大家介绍了索引中的映射类型,也就是每一个字段都有一个类型,比如:long,text,date等。这和我们的数据库非常的相似,那么它的不同之处是什么呢?对了,就是全文索引,在ES当中,只有text类型的字段才会用的全文索引,那么这里就会引出ES中一个非常重要的概念,文本分析器(Text analysis)。 分析器使ES支持全文索引,搜索的结果是和你搜索的内容相关的,而不是你搜索内容的确切匹配。我们用ES官网中的例子给大家举例,假如你在搜索框中输入的内容是Quick fox jumps,你想得到的结果是A quick brown fox jumps over the lazy dog,或者结果中包含这样的词fast fox或foxes leap。 分析器之所以能够使搜索支持全文索引,都是因为有分词器(tokenization),它可以将一句话、一篇文章切分成不同的词语,每个词语都是独立的。假如你在ES索引中添加了一条记录the quick brown fox jumps,而用户搜索时输入的内容是quick fox,并没有完全匹配的内容,但是因为有了分词器,你索引的内...
- 下一篇
ES7学习笔记(八)数据的增删改
在前面几节的内容中,我们学习索引、字段映射、分析器等,这些都是使用ES的基础,就像在数据库中创建表一样,基础工作做好以后,我们就要真正的使用它了,这一节我们要看看怎么向索引里写入数据、修改数据、删除数据,至于搜索嘛,因为ES的主要功能就是搜索,所以搜索的相关功能我们后面会展开讲。 Document的创建与更新 索引中的数据叫做document,和数据中的一条记录是一样的,而索引就像数据库中的一张表,我们向索引中添加数据,就像在数据库表中添加一条记录一样。下面我们看看怎么向索引中添加数据, PUT /<index>/_doc/<_id> POST /<index>/_doc/ PUT /<index>/_create/<_id> POST /<index>/_create/<_id> 在这个POST请求中,<index>也就是索引的名字是必须的,这就好比我们向数据库中插入记录,要知道往哪张表里插是一样的。<index>后面可以是_doc或者_create,这两个是什么意思呢?咱们慢...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS关闭SELinux安全模块
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS8编译安装MySQL8.0.19
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS6,7,8上安装Nginx,支持https2.0的开启