在介绍MOQL的上一篇文章《SQL to ElasticSearch DSL》里,提到了如何将SQL语法转换为ElasticSearch DSL的用法。这期间还出现乌龙事件,就是最新的代码并未提交到GitHub上,功能用不了,如今已经连同本次支持的内容全部更新提交。
上次介绍,MOQL支持在一定的语法集合范围内将SQL语法转换为ElasticSearch的DSL。但这个转换带来的易用性还不够。因为ElasticSearch的Java API不支持直接使用DSL直接查询,而ElasticSearch的HTTP API虽然支持直接使用DSL进行查询,但返回结果为json格式,还需要进行解析,且Query与Aggs的返回结果结构不同,需要一一进行解析,相当的繁琐。为使对ElasticSearch的访问更加方便,目前MOQL又添加了可以直接通过SQL调用就能获得访问结果的数据查询器EsDataQuerier。示例代码如下:
EsDataQuerier dataQuerier = new EsDataQuerier();
String[] serverIps = new String[] {"127.0.0.1"};
Properties properties = new Properties();
//properties.put(EsDataQuerier.HTTP_PORT, 9200);
//创建到ES服务器的连接
dataQuerier.connect(serverIps, properties);
String sql = "select ip.fw, ip.pri, ip.recorder, ip.proto from ip3 ip where ip.pri = 6 order by ip.src LIMIT 1000";
try {
//用指定sql语句访问ES服务,返回查询结果
RecordSet recordSet = dataQuerier.query(sql);
outputRecordSet(recordSet);
} catch (IOException e) {
e.printStackTrace();
}
RecordSet为一个类似与ResultSet的对象,用于存放结果集。其中,outputRecordSet方法的实现如下,可以简单看出RecordSet对象的结构。
void outputRecordSet(RecordSet recordSet) {
//recordSet的列头结构描述
RecordSetDefinition recordSetDefinition = recordSet
.getRecordSetDefinition();
StringBuffer sbuf = new StringBuffer();
//打印结果集列头
for (ColumnDefinition column : recordSetDefinition.getColumns()) {
sbuf.append(column.getName());
sbuf.append(" ");
}
System.out.println(sbuf.toString());
//输出结果集,结果集是一个数组的集合。集合的长度为结果集长度。每个数组为一条记录。
for (Object[] record : recordSet.getRecords()) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < record.length; i++) {
if (record[i] != null) {
sb.append(record[i].toString());
} else {
sb.append("NULL");
}
sb.append(" ");
}
System.out.println(sb.toString());
}
System.out.println("------------------------------------------------");
}