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的安装目录下,并打入如下的命令:

./bin/elasticsearch-plugin nstall 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分词器

首先我们创建一个index:

PUT chinese

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

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

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

    {
"acknowledged" : true
}

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

接下来,我们来index一些文档:

    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" : "北京,你好"
}
}
]
}
}

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

参考:

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

Elasticsearch:IK中文分词器的更多相关文章

  1. elasticsearch ik中文分词器安装

    特殊说明:灰色文字用来辅助理解的. 安装IK中文分词器 我在百度上搜索了下,大多介绍的都是用maven打包下载下来的源码,这种方法也行,但是不够方便,为什么这么说? 首先需要安装maven吧?其次需要 ...

  2. elasticsearch ik中文分词器的使用详解

    (基于es5.4)先喵几眼github,按照步骤安装好分词器 link:https://github.com/medcl/elasticsearch-analysis-ik 复习一下常用的操作 .查看 ...

  3. elasticsearch ik中文分词器的安装配置使用

    安装步骤  https://github.com/medcl/elasticsearch-analysis-ik 以插件形式安装: [elsearch@localhost elasticsearch- ...

  4. 如何给Elasticsearch安装中文分词器IK

    安装Elasticsearch安装中文分词器IK的步骤: 1. 停止elasticsearch 2.2的服务 2. 在以下地址下载对应的elasticsearch-analysis-ik插件安装包(版 ...

  5. 【自定义IK词典】Elasticsearch之中文分词器插件es-ik的自定义词库

    Elasticsearch之中文分词器插件es-ik 针对一些特殊的词语在分词的时候也需要能够识别 有人会问,那么,例如: 如果我想根据自己的本家姓氏来查询,如zhouls,姓氏“周”.      如 ...

  6. ElasticSearch速学 - IK中文分词器远程字典设置

    前面已经对”IK中文分词器“有了简单的了解:  但是可以发现不是对所有的词都能很好的区分,比如:  逼格这个词就没有分出来. 词库 实际上IK分词器也是根据一些词库来进行分词的,我们可以丰富这个词库. ...

  7. 沉淀再出发:ElasticSearch的中文分词器ik

    沉淀再出发:ElasticSearch的中文分词器ik 一.前言   为什么要在elasticsearch中要使用ik这样的中文分词呢,那是因为es提供的分词是英文分词,对于中文的分词就做的非常不好了 ...

  8. ElasticSearch安装中文分词器IK

    1.安装IK分词器,下载对应版本的插件,elasticsearch-analysis-ik中文分词器的开发者一直进行维护的,对应着elasticsearch的版本,所以选择好自己的版本即可.IKAna ...

  9. ElasticSearch的中文分词器ik

    一.前言   为什么要在elasticsearch中要使用ik这样的中文分词呢,那是因为es提供的分词是英文分词,对于中文的分词就做的非常不好了,因此我们需要一个中文分词器来用于搜索和使用. 二.IK ...

  10. elasticsearch使用ik中文分词器

    elasticsearch使用ik中文分词器 一.背景 二.安装 ik 分词器 1.从 github 上找到和本次 es 版本匹配上的 分词器 2.使用 es 自带的插件管理 elasticsearc ...

随机推荐

  1. SSH 多密钥配置

    目录 前言 一.SSH 是什么 二.密钥生成工具 三.密钥类型 四.本地配置 1.单密钥配置 2.多密钥配置 五.远端配置 1.GitHub/Gitee 2.服务器 前言 当我们从 GitHub 克隆 ...

  2. 强化学习-学习笔记14 | 策略梯度中的 Baseline

    本篇笔记记录学习在 策略学习 中使用 Baseline,这样可以降低方差,让收敛更快. 14. 策略学习中的 Baseline 14.1 Baseline 推导 在策略学习中,我们使用策略网络 \(\ ...

  3. Docker 安全及日志管理

    Docker 安全及日志管理 容器的安全性问题的根源在于容器和宿主机共享内核. 容器里的应用导致Linux内核崩溃,那么整个系统可能都会崩溃. 虚拟机并没有与主机共享内核,虚拟机崩溃一般不会导致宿主机 ...

  4. 74HC595驱动(并转串,fpga与时钟匹配,fpga与外部芯片的连接注意事项)

    上一次设计的动态扫描数码管显示电路模型如上,这是一个32位并行数据[31:0]disp_num选通输出并行数据[7:0]select和[7:0]段选的电路.因此需要输出16个信号 而在开发板上的电路与 ...

  5. 音响音箱/恒温壶/电量显示/电子数字时钟等LED数码管显示驱动IC-VK1640B 8段12位/12段8位显示

    市面上最常用的数码管为七段/八段显示,八段数码管比七段数码管多一个发光二极管单元(比七段数码管多一个点),又按能显示多少个"8"可分为1位.2位.4位等等.数码管又分为共阳极驱动/ ...

  6. 20220722-Java中this关键字

    this关键字知识总结 学习资源:B站韩顺平老师Java入门教学 代码示例1 public class This01 { public static void main(String[] args) ...

  7. EPLAN中的edz文件的用法

    1    EDZ 文件的定义 EDZ 是 EPLAN Data Archive Zipped(EPLAN 数据压缩文件包)的缩写,最早是专门为西门子定制的,现在已经 成为 EPLAN 中一种标准的部件 ...

  8. 大数据管理系统架构Hadoop

    Hadoop 起源于Google Lab开发的Google File System (GFS)存储系统和MapReduce数据处理框架.2008年,Hadoop成了Apache上的顶级项目,发展到今天 ...

  9. DolphinScheduler 功能开发:⼯作流级别任务空跑(后端),测试工作流是否正确执行...

    点击上方 蓝字关注我们 ✎ 编 者 按 在今年由中国科学院软件研究所主办的开源软件所供应链点亮计划-开源之夏活动中,有不少小伙伴提交了关于 DolphinScheduler 的项目,本期是来自成都信息 ...

  10. Java注解最全详解(超级详细)

    Java注解是一个很重要的知识点,掌握好Java注解有利于学习Java开发框架底层实现.@mikechen Java注解定义 Java注解又称Java标注,是在 JDK5 时引入的新特性,注解(也被称 ...