[译]ElasticSearch数据类型--string类型已死, 字符串数据永生
原文链接: https://www.elastic.co/blog/s...
Text vs. keyword
随着ElasticSearch 5.0的到来, 同时也迎来了该版本的重大特性之一: 移除了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数据类型--string类型已死, 字符串数据永生相关推荐
- ESQLC数据类型 - string类型
GBase8s ESQL/C字符串数据类型 GBase8s ESQL/C支持5种字符串数据类型, 如果在数据库的列中使用字符串类型,例如CHAR或者VARCHAR, 以下ESQL/C字符串类型可以使用 ...
- Mesos已死,容器永生
本文转载自 InfoQ "回顾过去,我认为 Mesos 的失败是种必然." 4 月 7 日,Apache 宣布开始投票进程,准备将曾火极一时的 Mesos 项目移至 Attic 下 ...
- JavaScript数据类型 - String类型
String类型 String类型用于表示由0或多个16位Unicode字符组成的 字符序列,即字符串.字符串可以由双引号"或单引号'表示,因此以下两种字符串写法都是正确的: var str ...
- 将String类型的Json字符串转化对象或对象数组
方法一:jsckson的ObjectMapper类 String jsonString = "";//json类型的字符串ObjectMapper mapper = new Obj ...
- 数仓已死?数据湖当立!
前言 前两天,我详细剖析了一下这两天脉脉上很火的数据建模帖子.指出来帖子里百度小哥"只见宽表不见建模"的核心原因是整个数据圈的核心逻辑变了. 然后就引起了建模群里一帮人在疯狂吐槽. ...
- string类型的数字字符串直接转换成int型方法
第一种方法:采取c语言中的atoi这个函数,具体代码如下: #include <stdlib.h>//需要这个头文件 #include <iostream> #include ...
- 传统 Ajax 已死,Fetch 永生
原谅我做一次标题党,Ajax 不会死,传统 Ajax 指的是 XMLHttpRequest(XHR),未来现在已被 Fetch 替代. 最近把阿里一个千万级 PV 的数据产品全部由 jQuery 的 ...
- 万维网已死,互联网永生
来源:基于CAIDA发表的思科预测,安德鲁·奥德泽科(Andrew Odlyzko) 万维网在诞生了20年后正在日薄西山,当更简单.更时尚的服务--例如应用程序App--正在越来越少关注于搜索,而越来 ...
- YUM已死,DNF永生
这个应该是从Fedora22开始的-- DNF从Yum分支出来,使用 专注于性能的C语言库hawkey进行依赖关系解析工作,大幅度提升包管理操作效率并降低内存消耗,按原先的节奏本应该是Fedora 2 ...
最新文章
- Apache Kafka-AckMode最佳实践
- linux ftp dns,Ubuntu下FTP与DNS服务器搭建教程PDF
- 解码Java.Lang.OutOfMemoryError:PermGen空间
- 【转】C#搭建Oauth2.0认证流程以及代码示例
- mysql数据库导入导出文件sql文件
- 排序算法第一篇——插入排序
- [LeetCode] 342. Power of Four(位操作)
- 【JavaScript】去除空格
- GB2312和ASCII码点阵字库HZK, ASC整理
- python爬虫实例——中国电影票房
- java毕业设计宠物店管理系统源码+系统+数据库+lw文档+调试运行
- 【计算机系统基础】- 袁春风
- Word 重复引用同一个脚注
- python中.item()的讲解
- HCIP H12-223 题库
- 数据清洗的几种常用手段
- 怎么去阅读文献-转自小木虫
- GCC编译器与编译过程
- 【phpcms-v9】phpcms-v9中添加广告联盟代码
- arduino 操作stm32
热门文章
- 一切技术创新史都是数据史
- 别笑,日本疫苗的温控方案真是这个
- 这周末,清华迎来了最小的学生和最牛的老师,Science都点赞的那种
- 树莓派悄悄放了个微软“后门”,系统加入微软源却未告知,用户怒了
- 刚刚,马斯克再次创造航天历史!SpaceX首次载人发射任务成功
- 流利说流年不利,市值跌去80%,AI教育第一股营收赚钱仍然依赖人工
- 这家公司耕耘超算20年,连续3年世界第一,现在加速中国AI
- Dynamic Expressions and Queries in LINQ
- vue本地项目静态资源管理
- 把现有的typesctipt+react项目接入到electron