text和keyword区别 term和match区别 ik中文分词器使用

  • 一、前言
  • 二、之前相关的博客
  • 三、造点测试数据
    • 1. 创建一个index
    • 2. 插入测试数据
  • 四、做一份试卷
    • 第1题:title term "宝贝"的结果?
    • 第2题:title term "宝宝"的结果?
    • 第3题:title term "宝"的结果?
    • 第4题:title term "ABC"的结果?
    • 第5题:title term "abc"的结果?
    • 第6题:title match "宝贝"的结果?
    • 第7题:title match "宝宝"的结果?
    • 第8题:title match "ABC"的结果?
    • 第9题:content match "宝贝"的结果?
    • 第10题:content match "宝"的结果?
    • 第11题:author term "宝"的结果?
    • 第12题:author term "彭钧"的结果?
    • 第13题:author match"彭钧"的结果?
  • 五、分析title字段
  • 六、分析content字段
  • 七、答案
    • 第1题:title term "宝贝"的结果?
    • 第2题:title term "宝宝"的结果?
    • 第3题:title term "宝"的结果?
    • 第4题:title term "ABC"的结果?
    • 第5题:title term "abc"的结果?
    • 第6题:title match "宝贝"的结果?
    • 第7题:title match "宝宝"的结果?
    • 第8题:title match "ABC"的结果?
    • 第9题:content match "宝贝"的结果?
    • 第10题:content match "宝"的结果?
    • 第11题:author term "宝"的结果?
    • 第12题:author term "彭钧"的结果?
    • 第13题:author match"彭钧"的结果?
  • 八、添加自定义的词项
    • 1. 添加自定义字典文件
    • 2. 配置自定义字典文件
    • 3. 测试
  • 九、token_count
  • 十、结语

一、前言

最近啊,我发现有个老同志(其实指我自己)在工作中用ES也好几年了,从ES5.6一直用到ES7.9。

但是这个同志对text和keyword区别、term和match区别还是很模糊,反正能用工具把ES中数据查询出来,全当MySQL这样关系型数据库用了。

我感觉ES的版本升的比较快,但是升的都是高级功能和底层实现。像text和keyword、term和match这些基础中的基础还是没啥变化的。

如果用ES好几年了,连text和keyword、term和match这些都搞不明白,还有脸说自己会ES?啊?看我老亚瑟给你一刀,再一刀,大招落地+斩杀,祝你幸福。

二、之前相关的博客

之前我的博客关于match、term、text和keyword的讲解也不少,主要集中如下三篇。有兴趣的请选择食用。
Elasticsearch笔记(九) Query DSL 查询教程
Elasticsearch笔记(十) Mapping 字段类型 keyword text date numeric
Elasticsearch笔记(十一) ES term terms prefix 搜索 聚合查询 详细总结

三、造点测试数据

1. 创建一个index

下面创建一个index,它只有3个字段

字段 说明 类型 分词器
title 标题 text ES自带的标准分词器,适合英文
author 作者 keyword
content 内容 text ik中文分词器,这里用 ik_smart

具体ik的安装和使用,网上优秀博客一大堆,这里我只给个官方链接吧
官方地址
下载地址

PUT pigg_blog
{"mappings": {"properties": {"title":{"type": "text","analyzer": "standard"},"author":{"type": "keyword"},"content":{"type": "text","analyzer": "ik_smart"}}}
}

2. 插入测试数据

PUT pigg_blog/_doc/1
{"title": "宝贝ABC","author": "宝贝巴士","content": "宝贝,宝贝ABC"
}PUT pigg_blog/_doc/2
{"title": "小跳蛙宝宝","author": ["彭钧", "李润"],"content": "小跳蛙宝宝"
}

四、做一份试卷

先做一份试卷,你可以先用笔记下你的答案,正确的答案在后面会给出。
每题你只需要写出返回的文档id。

第1题:title term "宝贝"的结果?

GET pigg_blog/_search
{"query": {"term": {"title": {"value": "宝贝"}}}
}

第2题:title term "宝宝"的结果?

GET pigg_blog/_search
{"query": {"term": {"title": {"value": "宝宝"}}}
}

第3题:title term "宝"的结果?

GET pigg_blog/_search
{"query": {"term": {"title": {"value": "宝"}}}
}

第4题:title term "ABC"的结果?

GET pigg_blog/_search
{"query": {"term": {"title": {"value": "ABC"}}}
}

第5题:title term "abc"的结果?

GET pigg_blog/_search
{"query": {"term": {"title": {"value": "abc"}}}
}

第6题:title match "宝贝"的结果?

GET pigg_blog/_search
{"query": {"match": {"title": "宝贝"}}
}

第7题:title match "宝宝"的结果?

GET pigg_blog/_search
{"query": {"match": {"title": "宝宝"}}
}

第8题:title match "ABC"的结果?

GET pigg_blog/_search
{"query": {"match": {"title": "ABC"}}
}

第9题:content match "宝贝"的结果?

GET pigg_blog/_search
{"query": {"match": {"content": "宝贝"}}
}

第10题:content match "宝"的结果?

GET pigg_blog/_search
{"query": {"match": {"content": "宝"}}
}

第11题:author term "宝"的结果?

GET pigg_blog/_search
{"query": {"term": {"author": {"value": "宝"}}}
}

第12题:author term "彭钧"的结果?

GET pigg_blog/_search
{"query": {"term": {"author": {"value": "彭钧"}}}
}

第13题:author match"彭钧"的结果?

GET pigg_blog/_search
{"query": {"match": {"author": "彭钧"}}}
}

五、分析title字段

看正确答案前,先看下分词器对文本的分析。

POST pigg_blog/_analyze
{"analyzer": "standard","text": ["宝贝ABC"]
}

结果如下:

{"tokens" : [{"token" : "宝","start_offset" : 0,"end_offset" : 1,"type" : "<IDEOGRAPHIC>","position" : 0},{"token" : "贝","start_offset" : 1,"end_offset" : 2,"type" : "<IDEOGRAPHIC>","position" : 1},{"token" : "abc","start_offset" : 2,"end_offset" : 5,"type" : "<ALPHANUM>","position" : 2}]
}
POST pigg_blog/_analyze
{"analyzer": "standard","text": ["小跳蛙宝宝"]
}

结果如下:

{"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" : 2,"end_offset" : 3,"type" : "<IDEOGRAPHIC>","position" : 2},{"token" : "宝","start_offset" : 3,"end_offset" : 4,"type" : "<IDEOGRAPHIC>","position" : 3},{"token" : "宝","start_offset" : 4,"end_offset" : 5,"type" : "<IDEOGRAPHIC>","position" : 4}]
}

六、分析content字段

POST pigg_blog/_analyze
{"analyzer": "ik_smart","text": ["宝贝,宝贝ABC"]
}

结果如下:

{"tokens" : [{"token" : "宝贝","start_offset" : 0,"end_offset" : 2,"type" : "CN_WORD","position" : 0},{"token" : "宝贝","start_offset" : 3,"end_offset" : 5,"type" : "CN_WORD","position" : 1},{"token" : "abc","start_offset" : 5,"end_offset" : 8,"type" : "ENGLISH","position" : 2}]
}
POST pigg_blog/_analyze
{"analyzer": "ik_smart","text": ["小跳蛙宝宝"]
}

结果如下:

{"tokens" : [{"token" : "小跳","start_offset" : 0,"end_offset" : 2,"type" : "CN_WORD","position" : 0},{"token" : "蛙","start_offset" : 2,"end_offset" : 3,"type" : "CN_CHAR","position" : 1},{"token" : "宝宝","start_offset" : 3,"end_offset" : 5,"type" : "CN_WORD","position" : 2}]
}

七、答案

不知道看过上面的解析,你对你的答案还确定几题呢?

第1题:title term "宝贝"的结果?

GET pigg_blog/_search
{"query": {"term": {"title": {"value": "宝贝"}}}
}

答案:空

第2题:title term "宝宝"的结果?

GET pigg_blog/_search
{"query": {"term": {"title": {"value": "宝宝"}}}
}

答案:空

第3题:title term "宝"的结果?

GET pigg_blog/_search
{"query": {"term": {"title": {"value": "宝"}}}
}

答案:1和2都返回

第4题:title term "ABC"的结果?

GET pigg_blog/_search
{"query": {"term": {"title": {"value": "ABC"}}}
}

答案:空

第5题:title term "abc"的结果?

GET pigg_blog/_search
{"query": {"term": {"title": {"value": "abc"}}}
}

答案:返回文档1

第6题:title match "宝贝"的结果?

GET pigg_blog/_search
{"query": {"match": {"title": "宝贝"}}
}

答案:1和2都返回

第7题:title match "宝宝"的结果?

GET pigg_blog/_search
{"query": {"match": {"title": "宝宝"}}
}

答案:1和2都返回

第8题:title match "ABC"的结果?

GET pigg_blog/_search
{"query": {"match": {"title": "ABC"}}
}

答案:返回文档1

第9题:content match "宝贝"的结果?

GET pigg_blog/_search
{"query": {"match": {"content": "宝贝"}}
}

答案:返回文档1

第10题:content match "宝"的结果?

GET pigg_blog/_search
{"query": {"match": {"content": "宝"}}
}

答案:空

第11题:author term "宝"的结果?

GET pigg_blog/_search
{"query": {"term": {"author": {"value": "宝"}}}
}

答案:空

第12题:author term "彭钧"的结果?

GET pigg_blog/_search
{"query": {"term": {"author": {"value": "彭钧"}}}
}

答案:返回文档2

第13题:author match"彭钧"的结果?

GET pigg_blog/_search
{"query": {"match": {"author": "彭钧"}}}
}

答案:返回文档2

八、添加自定义的词项

在上面发现ik分词器把”小跳蛙“分析成"小跳"和"蛙"这2个词,这个显然是不符合我预期的,这个时候就需要我们自己来添加自定义词项。

1. 添加自定义字典文件

在es的plugins\ik\config目录下,添加一个文本文件,命名为ext.dic,然后输入自己的词,最后一行也回车。

2. 配置自定义字典文件


然后重启es服务就可以了。

3. 测试

POST pigg_blog/_analyze
{"analyzer": "ik_smart","text": ["小跳蛙宝宝"]
}

结果如下:

{"tokens" : [{"token" : "小跳蛙","start_offset" : 0,"end_offset" : 3,"type" : "CN_WORD","position" : 0},{"token" : "宝宝","start_offset" : 3,"end_offset" : 5,"type" : "CN_WORD","position" : 1}]
}

这个时候你发现上面的只有"小跳蛙",没有"跳蛙",如果需要"跳蛙",可以把分析器设置为"ik_max_word",它会将词分析出最大数量的词项。

POST pigg_blog/_analyze
{"analyzer": "ik_max_word","text": ["小跳蛙宝宝"]
}

结果如下:

{"tokens" : [{"token" : "小跳蛙","start_offset" : 0,"end_offset" : 3,"type" : "CN_WORD","position" : 0},{"token" : "小跳","start_offset" : 0,"end_offset" : 2,"type" : "CN_WORD","position" : 1},{"token" : "跳蛙","start_offset" : 1,"end_offset" : 3,"type" : "CN_WORD","position" : 2},{"token" : "宝宝","start_offset" : 3,"end_offset" : 5,"type" : "CN_WORD","position" : 3}]
}

九、token_count

token_count是一个字段类型,用于统计分词后词项的个数,在特殊场景下还是比较有用的。
删除原来index,重新创建索引的mapping,并插入原来的数据。

PUT pigg_blog
{"mappings": {"properties": {"title":{"type": "text","analyzer": "standard"},"author":{"type": "keyword"},"content":{"type": "text","analyzer": "ik_smart","fields": {"length": {"type": "token_count","analyzer": "ik_smart"}}}}}
}
GET pigg_blog/_search
{"query": {"term": {"content.length": {"value": 3}}}
}

返回结果如下:

{"took" : 0,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 1,"relation" : "eq"},"max_score" : 1.0,"hits" : [{"_index" : "pigg_blog","_type" : "_doc","_id" : "1","_score" : 1.0,"_source" : {"title" : "宝贝ABC","author" : "宝贝巴士","content" : "宝贝,宝贝ABC"}}]}
}

十、结语

感觉做个IT打工仔,要学的东西很多,es,flink,spring cloud,vue,每次看到好的教程都是点赞,收藏,退出,一气呵成。还是慢慢学吧,积累一点算一点。

Elasticsearch教程(28) text和keyword区别 term和match区别 ik中文分词器使用相关推荐

  1. Elasticsearch:IK 中文分词器

    Elasticsearch 内置的分词器对中文不友好,只会一个字一个字的分,无法形成词语,比如: POST /_analyze {"text": "我爱北京天安门&quo ...

  2. elasticsearch 5.6.x单机环境构建(集成head插件和IK中文分词)

    elasticsearch近几年版本更新迭代的速度之已经超出了我的想象,想着我2016,2017年还在用着2.4.x版本,最近几年直接5.x,6.x,7.x版本了,看了一下下更新迭代的小版本时间几乎几 ...

  3. springboot elasticsearch vue ik中文分词器 实现百度/京东全文搜索

    背景:实现和百度搜索一样效果的,全文搜索引擎支持关键词高亮显示 文章目录 1. 企业级搜索引擎解决方案 2. 创建索引规则 3. 数据拉取 4. 搜索高亮 5. 自定义词库 6. 效果图 7. 开源源 ...

  4. Elasticsearch(二)IK中文分词器

    文章目录 安装 ik 分词器 在三个节点上安装 ik 分词器 查看安装结果 ik分词测试 `ik_max_word` 分词测试 `ik_smart` 分词测试 安装 ik 分词器 从 ik 分词器项目 ...

  5. ElasticSearch的IK中文分词器

    目录 概述 一.安装下载 二.设置es使用ik分词器 三.效果对比 四.ik分词器自定义字典 五.ik分词器自定义字典的配置 概述 本文主要介绍了 ik 分词器在es中的一些配置以及原理,包括 下载安 ...

  6. Elasticsearch(四) - IK中文分词器

    es对中文分词不给力,所以要用ik分词器. 下载和es对应版本的ik # cd /usr/local/elasticsearch-6.5.3/plugins # mkdir ik # cd ik/ # ...

  7. Elasticsearch配置ik中文分词器自定义词库

    1.IK配置文件 在config目录下: IKAnalyzer.cfg.xml:配置自定义词库 main.dic:分词器自带的词库,索引会按照里面的词创建 quantifier.dic:存放计量单位词 ...

  8. 如何在Elasticsearch中安装中文分词器(IK+pinyin)

    如何在Elasticsearch中安装中文分词器(IK+pinyin) 如果直接使用Elasticsearch的朋友在处理中文内容的搜索时,肯定会遇到很尴尬的问题--中文词语被分成了一个一个的汉字,当 ...

  9. ElasticSearch 之中文分词器

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

最新文章

  1. B-tree索引与Bitmap索引的对比测试
  2. java 无符号转有符号_java有符号无符号的转换
  3. 新书上市 | 新视角来了:《用户体验四维度》
  4. 求一个指定点对的路径上的最大边权或最小边权(转)
  5. Spring的7种事务传播行为类型
  6. 将 instance 连接到 vlan100- 每天5分钟玩转 OpenStack(95)
  7. Python常用的几种去重方式
  8. 读javascript高级程序设计13-JSON
  9. 【CodeForces - 675C】Money Transfers(思维,前缀和)
  10. php 上传sb2,基于标准的http来实现Android多文件上传
  11. Onvif之设备发现-基于gsoap2.8.27
  12. 文件错误关于hibernate中报Duplicate class/entity mapping org.model.User错的问题
  13. 记一次 GitHub 出现 ^M 符号的解决办法
  14. 第二季-专题14-串口来做控制台
  15. “word另存为PDF时,参考文献的上标都变为正常文本“的解决办法
  16. java项目---------------------------嗖嗖移动大厅
  17. NUAA 南航操作系统实验 代码部分
  18. Linux /centos7源码编译安装Nginx
  19. 亚马逊高级产品总监徐霄鹏:如何对不同用户群体采取差异化运营
  20. 计算机使用水平怎么填,计算机水平怎么填写?

热门文章

  1. Anaconda Navigator无法打开的解决方法
  2. 临界资源与临界区(十)
  3. layui框架学习(29:滑块模块)
  4. 我的屏幕颠倒了!!!
  5. 开发-通用设计-留痕
  6. Vim教程1 Vim的语法
  7. 深度学习Github项目实例复现:从虚拟环境安装到得出代码的复现结果
  8. 官方发布历年考研平均分!你今年考多少分才能上岸
  9. anaconda版本选择_Win10 安装Anaconda
  10. Centos7 安装jexus5.8.2