Elasticsearch 内置的分词器对中文不友好,只会一个字一个字的分,无法形成词语,比如:

POST /_analyze
{"text": "我爱北京天安门","analyzer": "standard"
}

如果我们使用的是 standard 的分词器,那么结果就是:

{"tokens" : [{"token" : "我","start_offset" : 0,"end_offset" : 1,"type" : "<IDEOGRAPHIC>","position" : 0},{"token" : "爱","start_offset" : 1,"end_offset" : 2,"type" : "<IDEOGRAPHIC>","position" : 1},...{"token" : "门","start_offset" : 6,"end_offset" : 7,"type" : "<IDEOGRAPHIC>","position" : 6}]
}

显然这对中文来说并不友好,它显示的每一个汉字。好在 Elastic 的大拿 medcl 已经为我们做好 IK 中文分词器。下面我们来详细介绍如何安装并使用中文分词器。具体的安装步骤可以在地址 https://github.com/medcl/elasticsearch-analysis-ik 找到。

安装

首先,我们可以到如下的地址查看一下是否有最新的版本对应你的 Elasticsearch 的发行版:

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

到目前截止日期,我们可以看到有最新的 v7.3.1 发行版。你需要根据自己的 Elasticsearch 的发行版选择同样版本的 ik 分词器进行安装。

那么,我们直接进入到我们的 Elasticsearch 的安装目录下,并打入如下的命令:

./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.3.1/elasticsearch-analysis-ik-7.3.1.zip

替代上面的7.3.1安装你自己想要的版本:

安装好后,我们可以通过如下的命令来检查是否已经安装好:

localhost:elasticsearch-7.3.0 liuxg$ ./bin/elasticsearch-plugin list
analysis-ik

上面的命令显示我们的 IK 已经安装成功了。

这个时候需要我们重新启动一下我们的 Elasticsearch,以便这个 plugin 能装被加载。

使用 IK 分词器

根据 IK 分词器的文档,它含有如下的部分:

Analyzer:

  • ik_smart
  • ik_max_word

Tokenizer:

  • ik_smart
  • ik_max_word

我们收使用先前的句子 “我爱北京天安门” 来检查一下:

POST _analyze
{"text": "我爱北京天安门","analyzer": "ik_smart"
}

上面的 ik_smart 分词器显示的结果是:

{"tokens" : [{"token" : "我","start_offset" : 0,"end_offset" : 1,"type" : "CN_CHAR","position" : 0},{"token" : "爱","start_offset" : 1,"end_offset" : 2,"type" : "CN_CHAR","position" : 1},{"token" : "北京","start_offset" : 2,"end_offset" : 4,"type" : "CN_WORD","position" : 2},{"token" : "天安门","start_offset" : 4,"end_offset" : 7,"type" : "CN_WORD","position" : 3}]
}

我们接着使用 ik_max_word 分词器来试一下同样的句子:

POST _analyze
{"text": "我爱北京天安门","analyzer": "ik_max_word"
}

上面的 ik_max_word 分词器显示的结果为:

{"tokens" : [{"token" : "我","start_offset" : 0,"end_offset" : 1,"type" : "CN_CHAR","position" : 0},{"token" : "爱","start_offset" : 1,"end_offset" : 2,"type" : "CN_CHAR","position" : 1},{"token" : "北京","start_offset" : 2,"end_offset" : 4,"type" : "CN_WORD","position" : 2},{"token" : "天安门","start_offset" : 4,"end_offset" : 7,"type" : "CN_WORD","position" : 3},{"token" : "天安","start_offset" : 4,"end_offset" : 6,"type" : "CN_WORD","position" : 4},{"token" : "门","start_offset" : 6,"end_offset" : 7,"type" : "CN_CHAR","position" : 5}]
}

从两个输出中我们可以看出来:这两者的区别在于它们提取词项的粒度上,ik_smart 提取粒度较粗,而后者 ik_max_word 则较细,它给出更多的 token。

接下来我们创建一个索引:

PUT chinese

接下来,我们来为这个index 创建一个 mapping

PUT /chinese/_mapping
{"properties": {"content": {"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_smart"}}
}

运行上面的命令后,如果出现如下的信息:

{"acknowledged" : true
}

它表明我们的安装时成功的。

接下来,我们来导入一些文档:

GET /chinese/_analyze
{"text": "我爱北京天安门","analyzer": "ik_max_word"
}

显示的结果为:

{"tokens" : [{"token" : "我","start_offset" : 0,"end_offset" : 1,"type" : "CN_CHAR","position" : 0},{"token" : "爱","start_offset" : 1,"end_offset" : 2,"type" : "CN_CHAR","position" : 1},{"token" : "北京","start_offset" : 2,"end_offset" : 4,"type" : "CN_WORD","position" : 2},{"token" : "天安门","start_offset" : 4,"end_offset" : 7,"type" : "CN_WORD","position" : 3},{"token" : "天安","start_offset" : 4,"end_offset" : 6,"type" : "CN_WORD","position" : 4},{"token" : "门","start_offset" : 6,"end_offset" : 7,"type" : "CN_CHAR","position" : 5}]
}

从上面的结果我们可以看出来,在我们的 token 中显示 “北京”,“天安” 及 “天安门”。这个和我们之前的是不一样的。

下面,我们输入两个文档:

PUT /chinese/_doc/1
{"content":"我爱北京天安门"
}PUT  /chinese/_doc/2
{"content": "北京,你好"
}

那么我们可以,通过如下的方式来进行搜索:

GET /chinese/_search
{"query": {"match": {"content": "北京"}}
}

我们显示的结果是:

{"took" : 1,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 2,"relation" : "eq"},"max_score" : 0.15965709,"hits" : [{"_index" : "chinese","_type" : "_doc","_id" : "2","_score" : 0.15965709,"_source" : {"content" : "北京,你好"}},{"_index" : "chinese","_type" : "_doc","_id" : "1","_score" : 0.100605845,"_source" : {"content" : "我爱北京天安门"}}]}
}

因为两个文档里都含有 “北京”,我们可以看出来两个文档都被显示出来了。

我们同时做另外一个搜索:

GET /chinese/_search
{"query": {"match": {"content": "天安门"}}
}

那么显示的结果是:

{"took" : 0,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 1,"relation" : "eq"},"max_score" : 0.73898095,"hits" : [{"_index" : "chinese","_type" : "_doc","_id" : "1","_score" : 0.73898095,"_source" : {"content" : "我爱北京天安门"}}]}
}

因为 “天安门” 只出现在第二个文档里,所以,我们可以看出来只有一个结果。

我们也同时做另外一个搜索:

GET /chinese/_search
{"query": {"match": {"content": "北京天安门"}}
}

在这里,我们来搜索“北京天安门”。请注意我们在 mapping 中使用了

"search_analyzer": "ik_smart"

也就是说,search_analyzer 会吧我们的“北京天安门”,分解成两个词 “北京” 及 “天安门”。这两个词将被用于搜索。通常对于 match 来说是 OR 关系,也就是说只要匹配到 “北京” 或 “天安门”,这两个之中的任何一个,那么就是匹配:

{"took" : 3,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 2,"relation" : "eq"},"max_score" : 0.7268042,"hits" : [{"_index" : "chinese","_type" : "_doc","_id" : "1","_score" : 0.7268042,"_source" : {"content" : "我爱北京天安门"}},{"_index" : "chinese","_type" : "_doc","_id" : "2","_score" : 0.22920427,"_source" : {"content" : "北京,你好"}}]}
}

上面显示的结果显示 “我爱北京天安门” 是最贴切的搜索结果。

如果大家想对 pinyin 分词器有兴趣的话,请参阅文章 “Elasticsearch:Pinyin analyzer”。

参考

【1】https://github.com/medcl/elasticsearch-analysis-ik

Elasticsearch:IK 中文分词器相关推荐

  1. Elasticsearch教程(28) text和keyword区别 term和match区别 ik中文分词器使用

    text和keyword区别 term和match区别 ik中文分词器使用 一.前言 二.之前相关的博客 三.造点测试数据 1. 创建一个index 2. 插入测试数据 四.做一份试卷 第1题:tit ...

  2. python连接es_Elasticsearch --- 3. ik中文分词器, python操作es

    一.IK中文分词器 1.下载安装 2.测试 #显示结果 {"tokens": [ {"token" : "上海","start_o ...

  3. ElasticSearch 之中文分词器

    4,中文分词器 4.1.  smartCN(这个是参照别人的安装方法安装的有兴趣可以试一下) 一个简单的中文或中英文混合文本的分词器 这个插件提供 smartcn analyzer 和 smartcn ...

  4. Elasticsearch之中文分词器插件es-ik(博主推荐)

    前提 什么是倒排索引? Elasticsearch之分词器的作用 Elasticsearch之分词器的工作流程 Elasticsearch之停用词 Elasticsearch之中文分词器 Elasti ...

  5. Kafka:ZK+Kafka+Spark Streaming集群环境搭建(十九)ES6.2.2 安装Ik中文分词器

    注: elasticsearch 版本6.2.2 1)集群模式,则每个节点都需要安装ik分词,安装插件完毕后需要重启服务,创建mapping前如果有机器未安装分词,则可能该索引可能为RED,需要删除后 ...

  6. ElasticSearch:为中文分词器增加对英文的支持(让中文分词器可以处理中英文混合文档)(转)

    本文地址,需转载请注明出处: http://blog.csdn.net/hereiskxm/article/details/47441911 当我们使用中文分词器的时候,其实也希望它能够支持对于英文的 ...

  7. 分词器以及ik中文分词器

    文章目录 分词器以及ik中文分词器 概念 ik分词器的安装 环境准备 设置jdk环境变量 下载maven安装包并解压 设置path 验证maven是否安装成功 下载IK分词器并安装 使用IK分词器 查 ...

  8. 学习 ES 的笔记、全文检索、倒排索引、Lucene、ik中文分词器、Kibana使用Dev Tools

    文章目录 感悟 新接触的单词 知识点一:ES是什么? 知识点二:ES基本概念 知识点三:1.1 什么是全文检索和Lucene? 知识点四:1.2 什么是倒排索引,Lucene实现全文检索的流程是怎样? ...

  9. 使用Docker快速安装部署ES和Kibana并配置IK中文分词器以及自定义分词拓展词库

    使用Docker快速安装部署ES和Kibana的前提:首先需要确保已经安装了Docker环境 如果没有安装Docker的话,可以参考上一篇的内容:Linux上安装Docker 有了Docker环境后, ...

最新文章

  1. 由于采用分时技术 用户可以独占计算机资源,计算机操作系统第1章练习题
  2. JavaScript由哪三部分组成呢?
  3. load和pageshow的区别
  4. sklearn自学指南(part11)--Elastic-Net及多任务Elastic-Net
  5. 清华计算机系上热搜!近9成优秀毕业生放弃留学,前50名41人留校深造
  6. 年轻人,看看 Redisson 分布式锁—可重入锁吧!太重要了
  7. xps文件服务器端,XPS文档读取查看器
  8. 前端——》Layui-下拉多选框拼音模糊匹配
  9. 企业内部报表生成思路
  10. 网络流量在线分析系统的设计与实现
  11. 行业下行,丧失亮点的OPPO慢人一步
  12. 高性能服务器架构拓扑图,某数据中心架构拓扑图.ppt
  13. Youtube 视频自动播放
  14. html 学习笔记(9)
  15. 拼插机器人课和围棋课_乐高机器人玩具与机器人教育有什么区别?
  16. APP开发究竟需要多少钱?
  17. 微信利用小号和大号的好友聊天(基于wxpy库)
  18. V4L2采集yuv视频花屏:Linux视频采集与编码(一)
  19. BaseQuickAdapter之BRVAH官方使用指南(持续更新)
  20. 好客租房101-项目介绍

热门文章

  1. 物联网笔记,基于华为云IOT
  2. 令我“细思极恐”的Faster-R-CNN
  3. 没有配置java环境变量,为什么我java环境变量都还没有配置都可以运行java程序了...
  4. P 问题、NP 问题、NPC 问题(NP 完全问题)、NPH 问题和多项式时间复杂度
  5. C++刻晴炸弹人小游戏(开发环境为codeblocks)
  6. 那些你必须知道的CMMI认证知识!
  7. 前端后端nginx配置
  8. 在office2016中,安装mathtype6.9后出现的dll文件缺失问题
  9. 解决vimdiff ‘E97: Cannot create diffs‘错误的一种方法
  10. 在 Windows 安装期间将 MBR 磁盘转换为 GPT 磁盘