一.前言

   之前有个需求,是使ElasticSearch支持使用SQL进行简单查询,较新版本的ES已经支持该特性(不过貌似还是实验性质的?) ,而且git上也有elasticsearch-sql

插件,之所以决定手写一个,主要有两点原因:

      1. 目前用的ES版本较老

      2. elasticsearch-sql虽好,但比较复杂,代码也不易维护

      3. 练练手

 二.技术选型

   目前主流软件中通常使用ANTLR做词法语法分析,诸如著名的Hibernate,Spark,Hive等项目,之前因为工作原因也有所接触,不过如果只是解析标准SQL的话,

 其实还有更好的选择,如使用Hibernate或阿里巴巴的数据库Druid(Druid采用了手写词法语法分析器的方案,这种方式当然比自动ANTLR生成的解析器性能高得多), 这里

 我选择了第二种方案。

     开始之前先看下我们可以通过Druid拿到的SQL语言的抽象语法树:

    

 

                                                  图片:upload/201911011031552434.gif" alt="复制代码" style="margin: 0px; padding: 0px; max-width: 800px; height: auto; border: none !important;" />