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. C语言-typedef和#define

    1.关键字 typedef 为一个数据类型起一个新的别名,typedef 的用法一般为: typedef OldName NewName; 需要强调的是,typedef 是赋予现有类型一个新的名字,而 ...

  2. paddlespeech asr 使用教程

    目录 安装 paddle框架安装 软件源安装 源码安装 快速使用 下载测试使用的音频 非流式命令行接口(CLI) 非流式Server服务 流式Server服务 指令详解 打印paddlespeech_ ...

  3. 开源数据质量解决方案——Apache Griffin入门宝典

    提到格里芬-Griffin,大家想到更多的是篮球明星或者战队名,但在大数据领域Apache Griffin(以下简称Griffin)可是数据质量领域响当当的一哥.先说一句:Griffin是大数据质量监 ...

  4. ooday05 JAVA_static final_抽象方法_抽象类

    final:最终的,不可改变的-----------单独应用几率低 修饰变量:变量不能被改变 //演示final修饰变量 class Aoo{ final int num = 5; void show ...

  5. 面试题:Java中为什么只有值传递?

    作者:小牛呼噜噜 | https://xiaoniuhululu.com 计算机内功.JAVA底层.面试相关资料等更多精彩文章在公众号「小牛呼噜噜 」 目录 经典的问题 形参&实参 Java是 ...

  6. 丽泽普及2022交流赛day20 1/4社论

    目录 T1 正方形 T2 玩蛇 T3 嗷呜 T4 开车 T1 正方形 略 T2 玩蛇 略 T3 嗷呜 (插一个删一个?) 找出相同的,丢掉循环节 . 感觉非常离谱,,, 正确性存疑 正确性问 SoyT ...

  7. 2509-Druid监控功能的深入使用与配置-基于SpringBoot-完全使用 .properties配置文件

    java实现的数据库连接池有很多,c3p0,dbcp等,还有号称速度最快的HikariCP,并且springboot2.0.2版本默认使用的就是HikariCP. 为什么选用Druid呢? - 性能够 ...

  8. 只要9.9元!零基础学习MySQL

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 导语 经过一段时间的筹备和整理,万里数据库<零基础学习MySQL>课程正式在腾讯课堂上线了. 课程地址:htt ...

  9. CF906C Party (状压DP)(未完成//鬼知道啥情况)

    CF上下了数据,本地能过,一交就错 这状压不用解释,看代码就懂. #include <iostream> #include <cstdio> #include <cstr ...

  10. GitHub Pages 站点建设

    1.简介 GitHub Pages 是通过 GitHub 托管和发布的公共网页,将纯文本转换为静态博客网站. 您可以使用 GitHub Pages 来展示一些开源项目.博客甚或分享您的简历,有内存限制 ...