es官方提供api查询接口是采用json风格的语法采用来组织的,可读性非常好,但是对于编写者来说则费时费力。因为json本身是一种面向机器设计的文档格式,严格的语法和标点要求不利于人类快速编写而不出语法错误。相比而言,风靡世界的google搜索框则已经被证明是最高效也最易于掌握的并且能够表达复杂语义的人机交互界面。
想像一下,语法"INDEX=twitter age>20 | SORT user DESC"即可查询符合名称为twitter索引的和字段age大于20条件的数据并查询结果按照user倒序排列是不是要比写一个json要愉快一些。同样的,"INDEX=twitter | STATS SUM(upflow) BY user"可以表达分组和统计功能。关键字AND、OR、DC、MIN、MAX、AVG、EVAL、TIMESPAN、LIMIT等可以添加到查询语句中以表达更加复杂的语义。
我们按照易用性的原则重新为es设计并实现了这种查询api,采用es rest插件方式,命名为elasticsearch-rest-command并开源在github上。同时,我们还设计了一个ui来支持快速查询和浏览。
下面我将详细说明是如何使用javacc来实现支持这种命令+管道风格的语法解析并查询得到对应结果。