近日,Elastic 在官方博客中宣布,Elasticsearch 5.0 正式发布。该版本基于Lucene 6.2.0,已经在 Elastic Cloud 上完成了部署。据称,这是迄今为止最快、最安全、最易用的版本。
Elasticsearch 5.0 带来了许多增强功能和新特性,主要包括:
- 索引性能:得益于多项改进,其中包括更好的数值型数据结构,索引吞吐量大幅提升。根据应用场景的不同,索引吞吐量提升在 25% 到 80% 之间。
- Ingest 节点:向 Elasticsearch 添加数据更简单了。Logstash 是一个强大的工具,而一些较小的用户只需要过滤器,不需要它所提供的众多路由选项。因此,Elastic 将一些最流行的 Logstash 过滤器(如 grok、split)直接在 Elasticsearch 中实现为处理器。多个处理器可以组合成一个管道,在索引时应用到文档上。
- Painless 脚本:Elasticsearch 中很多地方用到了脚本,而出于安全考虑,脚本在默认情况下是禁用的,这令人相当失望。为此,Elastic 开发了一种新的脚本语言 Painless。该语言更快、更安全,而且默认是启用的。不仅如此,它的执行速度是 Groovy 的 4 倍,而且正在变得更快。Painless 已经成为默认脚本语言,而 Groovy、Javascript 和 Python 都遭到弃用。要了解有关这门新语言的更多信息,请点击这里。
- 新数据结构:Lucene 6 带来了一个新的 Points 数据结构 K-D 树,用于存储数值型和地理位置字段,彻底改变了数值型值的索引和搜索方式。基准测试表明,Points 将查询速度提升了 36%,将索引速度提升了 71%,而占用的磁盘和内存空间分别减少了 66% 和 85%(参见“在 5.0 中搜索数值”)。
- 搜索和聚合:借助即时聚合,Kibana 图表生成速度显著提升。Elastic用一年的时间对搜索API 进行了重构,Elasticsearch 现在可以更巧妙地执行范围查询,只针对已经发生变化的索引重新计算聚合,而不是针对每个查询从头开始重新计算。在搜索方面,默认的相关性计算已经由TF/IDF 换成了更先进的 BM25 。补全建议程序经过了完全重写,将已删除的文档也考虑了进来。
- 更友好:Elasticsearch 5.0 更安全、更易用。他们采用了“尽早提示”的方法。如果出现了问题,则新版本会及早给出提示。例如,Elasticsearch 5.0 会严格验证设置。如果它不能识别某项设置的值,就会给出提示和建议。不仅如此,集群和索引设置现在可以通过 null 进行解除。此外,还有其他的一些改进,例如, rollover 和 shrink API 启用了一种新的模式来管理基于时间的索引,引入新的 cluster-allocation-explain API ,简化索引创建。
- 弹性:Elasticsearch 分布式模型的每一部分都被分解、重构和简化,提升了可靠性。集群状态更新现在会等待集群中的所有节点确认。如果一个“复制片(replica shard)”被“主片(primary)”标记为失败,则主片会等待“主节点(master)”的响应。索引现在使用数据路径中的 UUID,而不是索引名,避免了命名冲突。另外,Elasticsearch 现在进行启动检查,确保系统配置没有问题。配置比较麻烦,但如果只是试用,开发人员也可以选择 localhost-only 模式,避免繁琐的配置。另外,新版本还增加了断路器及其他一些软限制,限制请求使用的内存大小,保护集群免受恶意用户攻击。
此外,该版本还提供了一个底层的Java REST/HTTP 客户端,可以用于监听、日志记录、请求轮询、故障节点重试等。它使用Java 7,将依赖降到了最低,比Transport 客户端的依赖冲突少。而在基准测试中,它的性能并不输于Transport 客户端。不过,这是一个底层客户端,目前还没有提供任何查询构建器或辅助器。它的输入参数和输出结果都是JSON。
需要注意的是,该版本引入了许多破坏性更改,好在他们提供了一个迁移辅助插件,可以帮助开发人员从Elasticsearch 2.3.x/2.4.x 迁移到Elasticsearch 5.0。如果是从更早的Elasticsearch 版本向最新的5.0 版本迁移,则请查阅升级文档。
感谢杜小芳对本文的审校。
给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ , @丁晓昀),微信(微信号: InfoQChina )关注我们。
评论