MOQL—ElasticSearch转换器(Translator)

MOQL除提供从MOQL语法到Oracle、SQL Server、DB2、MySQL、PostgreSQL等SQL方言的语法转换器外,目前还支持了到ElasticSearch语法的转换。转换器的类名字为org.moql.sql.es.ElasticSearchTranslator。由于MOQL是SQL Like的,所以这个转换器可以完成从SQL语法到ElasticSearch查询语法的转换。由于ElasticSearch查询语法的语义与SQL语法语义各有所长,故MOQL只完成了部分二者语义存在交集的语法的转换工作。但该部分转换对于熟悉SQL,又想初步使用ElasticSearch进行查询的开发者已经足够。下面将对该转换器的用法及语法转换关系进行详细的描述。

代码示例

ElasticSearch转换器的使用非常简单,示例代码如下:


public static
void
main(String[] args) {

String sql = "select w.country, max(w.port), min(w.port) from web w group by w.country";

try {

//将sql语句串转换为ELASTICSEARCH方言的语法串

String es = MoqlUtils.translateMoql2Dialect(sql, SqlDialectType.ELASTICSEARCH);

es = es.trim();

//打印输出转换后的语法串

System.out.println(es);

} catch (MoqlException e) {

e.printStackTrace();

}

}

以上代码的执行结果如下:


{

"size":0,

"aggs":{

"condition":{

"filter":{

"match_all":{}

},

"aggs":{

"group":{

"terms":{

"field":"country"

},

"aggs":{

"column1":{

"max":{

"field":"port"

}

},

"column2":{

"min":{

"field":"port"

}

}

}

}

}

}

}

}

其它关于转换器的更多说明,可参考文章《MOQL—转换器(Translator)》。关于SQL到ElasticSearch DSL转换的更多示例可参见MOQL源码的org.moql.core.test.TestElasticSearchTranslator.java文件。

语法映射

MOQL转换器不能完整的转换SQL与ElasticSearch的语义,下面将对二者的语义转换关系进行详细的说明。


MOQL


ElasticSearch


UNION,INTERSECT,EXCEPT等集合操作子句


未转换映射


SELECT子句


当MOQL语句中不含DISTINCT和GROUP子句时,映射为ElasticSearch的Filter子句。此时在SELECT子句中指明具体的投影列不起作用,会被统一认为是选择全部列,即SELECT *;而当MOQL含有DISTINCT和GROUP子句时,映射为ElasticSearch的Aggs。此时SELECT子句中的投影列需遵循SQL语法的约定,这样才能正确转换。


DISTINCT子句


转换为ElasticSearch的Aggs子句。


FROM子句


不进行转换


WHERE子句


(注:WHERE子句都被转换为ElasticSearch的Filter子句,但当整个语句中存在GROUP子句时,Filter子句会嵌套在Aggs子句中)


and、or


映射为and filter和or filter


not、<>(不等于)


映射为not filter


=(等于)


映射为term filter


>(大于)、<(小于)、>=(大于等于)、<=(小于等于)、between


映射为range filter


like


映射为regexp filter


in


映射为terms filter


is


映射为exists filter


用于改变优先级的括号


映射为层级关系


附加部分:

regex(field, pattern)函数,用于正则表达式匹配。匹配模式比like更丰富,可参见正则表达式的相关文档。Field参数表示要进行匹配的字段;pattern参数表示匹配串。


映射为regexp filter


LIMIT子句


映射为ElasticSearch中的size属性。MOQL语句中含有或不含有DISTINCT和GROUP子句,该值会被映射到不同ElasticSearch子句的size属性上。


ORDER子句


当MOQL语句中不含DISTINCT和GROUP子句时,映射为ElasticSearch的sort子句;而当MOQL语句含有以上子句时,映射为Aggs中terms子句的order属性。


q*()


ElasticSearch中的Query子句(全文检索)在SQL中没有对应的语法,故该部分语法在MOQL中被设计为了一组前缀为q然后紧跟ElasticSearch对应Query子句名的函数,如:qmatch(…)对应match query子句。目前,MOQL只支持qmatch(field,message)一个函数。field可以是字段名也可以是字符串,当是字段名或字符串中只有一个字段名时转换为match query,如:field1, ’field1’分别是字段名和包含字段名的字符串,均转换为match
query;当field为包括多个字段名的字符串,字段名间用’,’号隔开时,转换为multi match query,如:’field1,field2’。

MOQL的相关路径如下:

项目地址:http://sourceforge.net/projects/moql/

代码路径:svn://svn.code.sf.net/p/moql/code/trunk

时间: 2024-10-16 01:43:57

MOQL—ElasticSearch转换器(Translator)的相关文章

[Elasticsearch] 部分匹配 (四) - 索引期间优化ngrams及索引期间的即时搜索

本章翻译自Elasticsearch官方指南的Partial Matching一章. 索引期间的优化(Index-time Optimizations) 目前我们讨论的所有方案都是在查询期间的.它们不需要任何特殊的映射或者索引模式(Indexing Patterns):它们只是简单地工作在已经存在于索引中的数据之上. 查询期间的灵活性是有代价的:搜索性能.有时,将这些代价放到查询之外的地方是有价值的.在一个实时的Web应用中,一个额外的100毫秒的延迟会难以承受. 通过在索引期间准备你的数据,可

Elasticsearch 基础笔记

资料篇 主站 中文指南 基础篇 简介 Elasticsearch是一个使用JAVA开发,基于Apache Lucene(TM)的开源搜索引擎. 分布式的实时文件存储,每个字段都被索引并可被搜索 分布式的实时分析搜索引擎 可以扩展到上百台服务器,处理PB级结构化或非结构化数据 索引(_index) ES中索引概念的区分 索引(名词) 它是相关文档存储的地方,一个索引(index)就像是传统关系数据库中的数据库. 索引(动词) 「索引一个文档」表示把一个文档存储到索引(名词)里,以便它可以被检索或者

使用 ElasticSearch + LogStash + Kibana 来可视化网络流量

简介 ELK 套装包括 ElasticSearch.LogStash 和 Kibana. 其中,ElasticSearch 是一个数据搜索引擎(基于 Apache Lucene)+分布式 NoSQL 数据库:LogStash 是一个消息采集转换器,类似 Syslog,可以接收包括日志消息在内的多种数据格式,然后进行格式转换,发送给后端继续处理:Kibana 是一个 Web 前段,带有强大的数据分析.整理和可视化功能. 是不是听起来就觉得十分强大! 一般情况下,ELK 套装的工作流程为 原始数据

ElasticSearch

一.概述 1.简介 ElasticSearch是一个基于Lucene实现的开源.分布式.Restful的全文本搜索引擎:此外,它还是一个分布式实时文档存储,其中每个文档的每个field均是被索引的数据,且可被搜索:也是一个带实时分析功能的分布式搜索引擎,能够扩展至数以百计的节点实时处理PB级的数据. 应用场景:当我们建立一个网站或应用程序,并要添加搜索功能,但是想要完成搜索工作的创建是非常困难的.我们希望搜索解决方案要运行速度快.能有一个零配置和一个完全免费的搜索模式.能够简单地使用JSON通过

学习elasticsearch(一)linux环境搭建(2)——启动elasticsearch

在启动访问es的过程中遇到了各种的奇葩问题. 1.网上各种版本的启动方式让人眼花缭乱不知如何启动.简单粗暴--到es的bin目录下直接 执行 ./elasticsearch //显示启动,ctrl+c可停止,如要操作,换个终端 ./elasticsearch -d 后台启动,可在当前终端继续操作 //后台启动,如要停止执行 kill -9 pid //哈哈,直接杀掉进程 //搜索es进程pid可以酱紫 ps aux | grep elasticsearch //注意,不确定那个是pid的话多执行

ELK学习笔记(一)安装Elasticsearch、Kibana、Logstash和X-Pack

最近在学习ELK的时候踩了不少的坑,特此写个笔记记录下学习过程. 日志主要包括系统日志.应用程序日志和安全日志.系统运维和开发人员可以通过日志了解服务器软硬件信息.检查配置过程中的错误及错误发生的原因.经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误. 通常,日志被分散的储存不同的设备上.如果你管理数十上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志.这样是不是感觉很繁琐和效率低下.当务之急我们使用集中化的日志管理,例如:开源的syslog,将所有服务器上的日志收

elasticsearch index 之 put mapping

mapping机制使得elasticsearch索引数据变的更加灵活,近乎于no schema.mapping可以在建立索引时设置,也可以在后期设置.后期设置可以是修改mapping(无法对已有的field属性进行修改,一般来说只是增加新的field)或者对没有mapping的索引设置mapping.put mapping操作必须是master节点来完成,因为它涉及到集群matedata的修改,同时它跟index和type密切相关.修改只是针对特定index的特定type. 在Action su

Elasticsearch VS Solr

最近公司用到了ES搜索引擎,调研发现大公司常用的搜索引擎还有Solr. 鉴于 Lucene 强大的特性和稳定性,有很多种基于 Lucene 封装的企业级搜索平台.其中最流行有两个:Apache Solr 和 Elastic search. Apache Solr:它本身是 Apache Lucene 项目下的开源企业搜索平台,算是 Lucene 的直系.美团.阿里搜索服务是基于 Solr 来搭建的. Elastic Search:简称 ES,由 Elastic 公司开发.Elastic 成立于

springmvc 类型转换器 自定义类型转换器

自定义类型转换器的步骤: 1.定义类型转换器 2.类型转换器的注册(在springmvc配置文件处理) 来解决多种日期格式的问题: