Elasticsearch 中数据类型 text 与 keyword 的区别
随着ElasticSearch 5.X 系列的到来, 同时也迎来了该版本的重大特性之一: 移除了string
类型. 这个变动的根本原因是string
类型会给我们带来很多困惑: 因为ElasticSearch对字符串拥有两种完全不同的搜索方式. 你可以按照整个文本进行匹配, 即关键词搜索(keyword search), 也可以按单个字符匹配, 即全文搜索(full-text search). 对ElasticSearch稍有了解的人都知道, 前者的字符串被称为not-analyzed
字符, 而后者被称作analyzed
字符串.
事实上, 同一种类型用于应对两种不同的使用场景是会让人崩溃的, 因为有些选项只对其一的场景设置有效.例如position_increment_gap
对not-analyzed
字符就不会起作用, 而像ignore_above
对于analyzed
字符串就很难区分它到底是对整个字符串的值有效还是对单独的每个分词有效(在这种场景, ignore_above确实只对整个字符串值有效, 而对单个分词的限制可以使用limit
设置).
为了避免上述尴尬, string
字段被拆分成两种新的数据类型: text
用于全文搜索的, 而keyword用于关键词搜索.
新的默认类型
做了这个类型分解之后, 我们对string字段的默认dynamic mappings 也做了改变. 在以前刚接接触ElasticSearch时, 如果需要对某个字段的所有取值做聚合, 你不得不对这些数据重做索引. 假如你正在处理的文档中包含一个city
字段. 对这个字段做聚合的话会分别给出new
和york
的总数, 而非我们通常期望的New York
的总数.让人沮丧的是为了达到我们希望的结果, 我们必须对这个字段重新进行索引.
为了不让事情变得这么糟糕, ElasticSearch决定从Logstash中借取思路: 字符串将默认被同时映射成text
和keyword
类型. 例如对下面的文档进行索引后:
- {
- "foo": "bar"
- }
ElasticSearch将会为你创建下面的动态映射(dynamic mappings):
- {
- "foo": {
- "type": "text",
- "fields": {
- "keyword": {
- "type": "keyword",
- "ignore_above": 256
- }
- }
- }
- }
当然, 基于这个映射你即可以在foo
字段上进行全文搜索, 也可以通过foo.keyword
字段实现关键词搜索及数据聚合.
禁用这个特性也很方便: 你只需要在定义mapping时显式声明字符串字段的类型或者使用一个动态模板(dynamic template)
来匹配你所有的字符串字段即可. 例如通过下面的dynamic template
就可以恢复到在ElasticSearch 2.x中使用的dynamic template的效果:
- {
- "match_mapping_type": "string",
- "mapping": {
- "type": "text"
- }
- }
如何迁移到新版本
通常, 迁移工作是非常容易的. 以前映射到analyzed
的字符串的字段:
- {
- "foo": {
- "type": "string",
- "index": "analyzed"
- }
- }
如今只要映射为text
即可:
- {
- "foo": {
- "type": "text",
- "index": true
- }
- }
以前被定义为not_analyzed
的字符串字段:
- {
- "foo": {
- "type": "string",
- "index": "not_analyzed"
- }
- }
也只需要被定义为keyword
即可:
- {
- "foo": {
- "type": "keyword",
- "index": true
- }
- }
如上所述, string
字段被重新定义为text
和keyword
字段. 对于上面的index
属性, 因为在新的定义中我们不需要三种状态(在以前的string
定义中可以是analyzed
, not_analyzed
和no
), 所以只简单的定义成了boolean值, 以告知ElasticSearch是否可在该字段上进行搜索.
向后兼容
因为大的版本升级本身就充满挑战, 因此官方尽力不让在在升级ElasticSearch过程中更新你的mapping字义. 首先, string
字段可以继续在已定义的2.x版本的索引中继续使用, 而当创建新的索引时, ElasticSearch会做些处理以自动把string
映射成等价的text
或keyword
. 如果在你已有的索引模板(index template)中定义有string
字段, 这一点将非常有用, 因为这些模板无须改动即可使用到ElasticSearch 5.x中. 话说回来, 你还是需要着手做这些模板做些升级, 因为在ElasticSearch 6.0中我们可能会移除这个向后兼容的逻辑.
Elasticsearch 中数据类型 text 与 keyword 的区别的更多相关文章
- Elasticsearch中text与keyword的区别
text类型 1:支持分词,全文检索,支持模糊.精确查询,不支持聚合,排序操作; 2:test类型的最大支持的字符长度无限制,适合大字段存储: 使用场景: 存储全文搜索数据, 例如: 邮箱内容.地址. ...
- ES 15 - Elasticsearch中的数据类型 (text、keyword、date、geo等)
目录 1 核心数据类型 1.1 字符串类型 - string(不再支持) 1.1.1 文本类型 - text 1.1.2 关键字类型 - keyword 1.2 数字类型 - 8种 1.3 日期类型 ...
- jQuery中的text(),html(),val()的区别
一.jquery中HTML 1. 无参html() 方法用来获取任意元素的HTML内容,如果你调用多个选定元素的.html()方法,那么其读取的只是第一个元素,换句话说:如果选择器匹配多于一个的元素, ...
- jQuery中val() text()和html()的区别
2020年4月21日 16:48:11 jQuery 学习 html() 它可以设置和获取起始标签和结束标签中的内容. 跟 dom 属性 innerHTML 一样.text() 它可以设置和获取起始标 ...
- JQuery中的text(),html()和val()区别
定义和用法 text() 方法方法设置或返回被选元素的文本内容 代码如下 <!DOCTYPE html> <html lang="en"> <head ...
- ES索引Index相关操作&ES数据类型、字符串类型text和keyword区别
1.查看索引以及删除之前的测试索引 1. 查看索引以及索引数量信息 liqiang@root MINGW64 ~/Desktop $ curl -X GET http://127.0.0.1:9200 ...
- 【转】elasticsearch中字段类型默认显示{ "foo": { "type": "text", "fields": { "keyword": {"type": "keyword", "ignore_above": 256} }
官方原文链接:https://www.elastic.co/cn/blog/strings-are-dead-long-live-strings 转载原文连接:https://segmentfault ...
- SQL Server中Text和varchar(max) 区别
SQL Server 2005之后版本:请使用 varchar(max).nvarchar(max) 和 varbinary(max) 数据类型,而不要使用 text.ntext 和 image 数据 ...
- js中的text(),html() ,val()的区别
js中的text(),html() ,val()的区别 text(),html() ,val()三个方法用于html元素的存值和取值,但是他们各有特点,text()用于html元素文本内容的存取,ht ...
随机推荐
- 深入理解Redis高可用方案-Sentinel
Redis Sentinel是Redis的高可用方案.是Redis 2.8中正式引入的. 在之前的主从复制方案中,如果主节点出现问题,需要手动将一个从节点升级为主节点,然后将其它从节点指向新的主节点, ...
- H5 58-网页的布局方式
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 学习yii2.0——行为
学习yii框架的行为之前,需要先了解yii的事件,可以参考这篇博客: 怎么理解行为 yii框架的行为有点类似于trait,可以有个大体的概念: 1.有一个类A,包含一些属性和方法,很普通的一个类A. ...
- 【转】实现Nginx代理WSS协议
https://blog.csdn.net/chopin407/article/details/52937645 后来看到了官网的教程(http://nginx.org/en/docs/http/we ...
- Spring.profile配合Jenkins发布War包,实现开发、测试和生产环境的按需切换
前两篇不错 Spring.profile实现开发.测试和生产环境的配置和切换 - Strugglion - 博客园https://www.cnblogs.com/strugglion/p/709102 ...
- python安装与使用(Windows)
日常使用PHP开发较多,但是有些地方PHP的语言的瓶颈就显露出来了,例如,同样是抓取一个网站的内容,使用PHP需要较为复杂的正则匹配,效率较为低下.python具有丰富的类库,拿过来直接可以使用,功能 ...
- 【360图书馆】插入U盘自动攻击:BadUSB原理与实现
插入U盘自动攻击:BadUSB原理与实现 漏洞背景 “BadUSB”是今年计算机安全领域的热门话题之一,该漏洞由Karsten Nohl和Jakob Lell共同发现,并在今年的Black ...
- RandomStringUtils
System.out.println(RandomStringUtils.random(5));//随机多少个随机字符中文环境乱码 System.out.println(RandomStringUti ...
- MySQL 单个表锁死 对查询语句无响应
这个时候应该怀疑读取都被加锁,应该尝试使用 show processlist 查看每一个正在运行的进程. 可以看到这样一个列表,里面有使用者即用户,正在使用数据库的 host, 使用的 db 目前的 ...
- nfs+keepalived高可用
1台nfs主被服务器都下载nfs.keepalived yum install nfs-utils rpcbind keepalived -y 2台nfs服务器nfs挂载目录及配置必须相同 3.在主n ...