导读:本文介绍 Elasticsearch 最新的动态,包括 ES 5.x 改进详解与 ES6 展望,由曾勇在高可用架构群分享,转载请注明来自高可用架构公众号。
曾勇(Medcl),Elastic 工程师与布道师,2015 年加入 Elastic 公司。加入 Elastic 之前,在搜索和运维等方面积累了超过七年的经验。Elasticsearch 国内首批用户,自 2010 年起就开始接触 Elasticsearch,是 ES 中文社区发起人,也是 Elastic 在中国的首位员工。
我最早是从 2010 年 3 月开始接触 Elasticsearch ,后面在 2015 年 9 月加入了 Elastic ,即 Elasticsearch 这款开源软件背后的公司,一直围绕在 ES 打转,也算是 ES 半个老司机了。
自去年 10 月正式发布 5.0 以来, Elasticsearch 又新增了不少东西,让我们一起来看一下都有哪些值得关注的特性和改进吧。
数据结构方面
首先是索引这块的改进,大家知道 ES 的数据支持增删改查,比如修改文档的时候其实是需要通过 ID 找到 Lucene 文件里对应的文档先删除然后再插入一个新的,所有写操作需要进行相应的版本检查来确保没有冲突。
如果你的场景是日志,那么基本上数据进去之后是不需要进行修改的,所以现在 ES 新增了一个 append-only 的索引模式,也就是当 ES 是自动生成 ID 的时候, ES 可以跳过不必要的版本检测,大概可以提升 20% 左右的索引性能。
我们来看一组前后对比图吧,单这一块的提升还是可圈可点的。
在数据结构方面,新增了多个 range 字段类型,有什么用呢,现在你可以计算连续数据的交并集,可以是时间范围,也可以是数值范围。
比如数据存放的是会议信息,航班有一个 range 字段,里面存的是会议的开始和结束时间,你通过对应的 range 查询可以很方便的查询,得到某个时间点哪些会议同时正在进行,那段时间会议室有空闲,可以预订等等。
常见的场景,比如日历,电视节目单。
怎么使用呢?看例子会比较清晰一点。
首先看看怎么定义吧,下面的这个例子, mapping 里面设置字段的 type 为 date_range 即表示一个时间的范围字段:
然后我们插入一些数据,可以看到指定的是一个范围,有起始值。
查询呢?
大概就是这么简单。
下一个特性值得介绍的就是 _all 字段的移除
关于 _all 这个字段,场景其实就是为了满足快速检索的需求,当你不知道 mapping 里面有什么字段的情况下,你也能够自由的进行搜索, 所以为了实现这个需求,就有一个 _all 字段,它会把其他字段的内容都拷贝到这个字段里面,然后都当成 string 类型来处理,所以就存在了数据的冗余了,另外数字当成 string 也不能很好的压缩,并且都在 _all 一个字段,所以只能用一种分析器,在高亮的时候也是对这个 _all 字段进行的高亮,而不是真实的字段值,显示起来效果