MOQL—ElasticSearch转换器(Translator)
来源:互联网 发布:毕业论文公司数据作假 编辑:程序博客网 时间:2024/06/03 20:08
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
新项目地址:https://github.com/colorknight/moql
- MOQL—ElasticSearch转换器(Translator)
- MOQL—转换器(Translator)
- MOQL—过滤器(Filter)
- MOQL—筛选器(Selector)(一)
- MOQL—筛选器(Selector)(二)
- MOQL—筛选器(Selector)(三)
- MOQL简介
- poj 2121——Inglish-Number Translator
- POJ2121——Inglish-Number Translator
- Message Translator
- Message Translator
- 转换器
- 转换器
- MOQL-复杂事件处理(CEP)
- 二——十进制转换器
- Struts1——自定义转换器
- WPF学习——转换器
- qemu a fast and portable dynamic translator——大致翻译
- Android最佳性能实践(一)——合理管理内存
- Android最佳性能实践(二)——分析内存的使用情况
- jquery 显示隐藏div方法show(),hide(),toggle(),slideDown()总结
- chrome 谷歌浏览器无法登录
- 认识与入门 Markdown
- MOQL—ElasticSearch转换器(Translator)
- ubuntu 安装Broadcom BCM43142 无线网卡驱动
- UITableView的相关属性
- Netty5入门(2)
- 如何在Eclipse中安装Freemarker编辑器插件
- 笔记102--摘自爱哥03
- 数据库索引
- BZOJ系列1406《[AHOI2007]密码箱》题解
- [转载]发表学术论文必须做的10件事