SQL to ElasticSearch DSL

        众所周知ElasticSearch目前是一个应用最为广泛的分布式搜索与分析引擎,它的功能强大,能够已很高的性能访问大规模数据。它拥有强大的查询分析语法,能够完成模糊查询、精准查询及聚集计算等诸多功能的表达。但对于那些用惯了SQL语言的数据分析人员来说,掌握ElasticSearch的DSL语言来做以前熟悉的事情,还是有比较陡的学习曲线的。

MOQL是一款基于Java的面向内存对象过滤、查询及统计分析的开源工具,即可以用SQL语言对JAVA内存中的任意集合对象进行统计计算,详见《MOQL简介》。除此外,MOQL还有一个子模块moql-translator,该模块用于完成从MOQL语法(SQL语法的一个子集,涵盖了绝大多数常用语法)到各类不同数据库SQL语法的转换,如它提供到Oracle、SqlServer以及DB2等不同SQL方言的转换,也提供了到ElasticSearch DSL的语法转换。有了这种转换,可以大大降低数据分析人员学习不同分析语言的学习曲线,能够快速的享受新的分析引擎技术带来的便利。

        MOQL本质上是一个开发程序包,应用它进行SQL到ElasticSearch DSL的转换非常方便,如下代码示例:

SQL to ElasticSearch DSL_第1张图片

       该代码执行完转换后,输出的ElasticSearch DSL语法为:

SQL to ElasticSearch DSL_第2张图片

        将该结果提交给ElasticSearch引擎可以达到与程序中sql语句匹配的执行效果。就是这样简单,可以立刻去https://github.com/colorknight/moql下载个源码试试了。
当然由于ElasticSearch DSL语法的能力过于强大,MOQL目前还无法提供完整的转换能力,并且为适应两种不同语法间的差异还做了些技巧性的设计,需要使用者在使用时加以注意。

ElsaticSearch DSL的query子句中有query上下文与filter上下文两种上下文(本文不解释两种上下文的差异,请参见相关资料),这两种上下文分别对应了SQL语法的两个子句。query上下文对应了where子句,filter上下文对应了having子句。这样的对应关系主要是技巧性的对应,并不体现各部分在ElasticSerach上的执行顺序。所以在应用ElasticSearch DSL的此类特性时需要留意,不要写错SQL子句。

        另外,对于MOQL现在不能支持的ElasticSearch DSL的特殊语法,MOQL建议通过编写函数(UDF,User Define Function)的方式予以扩展。扩展时通过继承org.moql.sql.es. ESFunctionTranslator接口来实现扩展函数,然后再去org.moql.sql.es. ElasticSearchTranslator中注册函数即可。

        下面将给出SQL与ElasticSearch DSL的语法转换对照表,方便使用者全面了解SQL转换成ElasticSearch DSL后能达到的语法能力。

SQL to ElasticSearch DSL_第3张图片


SQL to ElasticSearch DSL_第4张图片

SQL to ElasticSearch DSL_第5张图片

你可能感兴趣的:(MOQL,JAVA技术,ElasticSearch)