ElasticSearch 新版发布,改进的聚合功能和脚本功能成亮点

  • Roopesh Shenoy
  • 赵震一

2014 年 7 月 31 日

话题:数据库语言 & 开发AI

ElasticSearch 发布了 1.3.0 版。该版本基于Lucene 4.9,带来了更为出色的聚合功能,并包含了安全、脚本处理以及索引性能等多个方面的改进。

出于安全考虑,动态脚本Dynamic Scripting)这一功能在 1.2 版中是被默认禁用的。而如今,这一选项针对沙箱化的语言(sandboxed languages)是默认启用的。Groovy也得到了沙箱支持,目前替代MVEL成为了脚本功能的首选语言。MVEL 目前已不再被推荐使用,并将于 1.4 版被移除。

我们来看看其他一些新的脚本功能:

  • Lucene 表达式(Lucene Expressions作为一项试验性功能被集成进了核心包。该功能提供了一套机制,它可以将 JavaScript 搜索表达式编译成字节码,从而获得很高的执行速度。早些时候的一些基准测试显示,这一方式较 Groovy 脚本有 4 到 6 倍的速度提升。伴随着速度的提升也带来了一些局限性,你只能通过这种方式访问数值类型的域(fields),且无法访问那些已存储的域(译者注:相对于索引域和分词域),而那些稀疏域(某些文档在该域上没有值)将会返回默认值 0;除此之外,它仅能用于搜索,而不能用于文档更新。
  • 脚本(包括搜索模板 -Search templates)目前可以被保存到一个特殊的.scripts 索引中,从而无须像原来那样保存到每个节点的配置目录中。这样一来,用户可以通过新的查询(query)来更新 script/template,从而使“用户自定义”的查询变得更加容易。

我们再来看看新的聚合功能:

  • 域的折叠与融合(Field Collapsing/Combining)——可以将一组值折叠成一个或固定数量的条目,从而能防止出现重复的文档。
  • 百分位等级聚合(Percentile Ranks Aggregation——该试验性功能展示了观测值在某个特定值之下的百分率。
  • 为某个域进行地理位置值的地理范围聚合——该功能提供了一个覆盖了所有位置值的范围框图(举个例子:一个销售区域而非独立的销售城市列表)。
  • 在高基数(high cardinality)域上的词元(terms)聚合具有更好的性能。
  • collect_mode选项允许你定义是否在子聚合计算完之前进行父级聚合的分支裁剪(广度优先)。在大多数查询中,深度优先这一默认值( 所有分支在被裁剪之前,第一遍就展开到该分支的深度)往往能给出更好的结果,但是针对那些拥有很多唯一词元的域以及必须返回少量结果的情况,广度优先将会更加有效。

新版本在索引和 I/O 方面也带来了一些性能提升。尤其是 Lucene 4.9,它具有更加卓越的压缩特性,从而提升了磁盘和内存的使用率。新版本同时在弹性方面也做了改进。

这一版同样也引入了一些重大的变化——举个例子,出于安全考虑,JSONP 目前已被默认禁用。你可以通过阅读发布说明来对变更列表中的全部内容进行进一步了解。

查看英文原文:ElasticSearch Gets Better Aggregation, Adds Groovy for Scripting

数据库语言 & 开发AI