一步到位,用SQL检索ElasticSearch

     在介绍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("------------------------------------------------");
}
 

你可能感兴趣的:(JAVA技术,MOQL,ElasticSearch)