Elasticsearch通关教程(五):如何通过SQL查询Elasticsearch (3)

使用前我们需要先引入maven依赖

<dependency> <groupId>org.nlpcn</groupId> <artifactId>elasticsearch-sql</artifactId> <version>x.x.x.0</version> </dependency>

版本号(x.x.x)需要和 Elasticsearch的版本对应上,具体的对应关系大致可以参考下图:

Elasticsearch通关教程(五):如何通过SQL查询Elasticsearch


Elasticsearch通关教程(五):如何通过SQL查询Elasticsearch

但是不是所有的版本,我们都可以从Maven Repository里获取到,我们如果直接从Maven 仓库里面只能获取如下几个版本的依赖,其中缺少很多版本:

Elasticsearch通关教程(五):如何通过SQL查询Elasticsearch

那如果我们使用的是其他版本的 ES 如何解决依赖 jar包问题呢?还记得我们开始下载插件解压后的sql文件夹吗?例如6.5.0版本的插件的解压后文件夹内容如下:

Elasticsearch通关教程(五):如何通过SQL查询Elasticsearch

这里面就有我们需要的 jar包,有了 jar包就好办了,我们可以直接加入到项目中,当然最好的方式是上传到公司的私有仓库里面,然后通过pom文件依赖进来。

搭建项目

jar包问题解决之后就可以正式进入开发阶段了,新建一个springboot项目,引入各项依赖,一切准备就寻后,如何连接ES呢?

这里有两种方式可以实现我们的功能,一个是通过JDBC的方式,连接数据库一样连接ES。还有一种就是通过 tansport client 方式。

JDBC的方式

代码示例

public void testJDBC() throws Exception { Properties properties = new Properties(); properties.put("url", "jdbc:elasticsearch://192.168.3.31:9300,192.168.3.32:9300/" + TestsConstants.TEST_INDEX); DruidDataSource dds = (DruidDataSource) ElasticSearchDruidDataSourceFactory.createDataSource(properties); Connection connection = dds.getConnection(); PreparedStatement ps = connection.prepareStatement("SELECT gender,lastname,age from " + TestsConstants.TEST_INDEX + " where lastname='Heath'"); ResultSet resultSet = ps.executeQuery(); List<String> result = new ArrayList<String>(); while (resultSet.next()) { System.out.println(resultSet.getString("lastname") + "," + resultSet.getInt("age") + "," + resultSet.getString("gender")) } ps.close(); connection.close(); dds.close(); }

这种方式是最直观的,用到了Druid连接池,所以我们还需要在项目中引入druid依赖,而且需要注意依赖的版本,否则会报错。

<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.15</version> </dependency>

这种方式很好理解,而且开发也方便,但是我在项目中应用了发现它有很多不足,所以我最后还是自己看了下源码,通过API的方式重新封装调用。

API方式

其实 elasticsearch-sql 没有提供开发的 文档,并没有介绍如何通过调用 Java API方式开发,我们需要阅读 elasticsearch-sql 的源代码来发现它的service,然后包装成我们需要的,通过阅读源码我们发现了如下一个功能明显的Service类。

public class SearchDao { private static final Set<String> END_TABLE_MAP = new HashSet<>(); static { END_TABLE_MAP.add("limit"); END_TABLE_MAP.add("order"); END_TABLE_MAP.add("where"); END_TABLE_MAP.add("group"); } private Client client = null; public SearchDao(Client client) { this.client = client; } public Client getClient() { return client; } /** * Prepare action And transform sql * into ES ActionRequest * @param sql SQL query to execute. * @return ES request * @throws SqlParseException */ public QueryAction explain(String sql) throws SqlParseException, SQLFeatureNotSupportedException { return ESActionFactory.create(client, sql); } }

SearchDao 类中有一个explain方法,接收的参数就是一个字符串sql ,返回结果是 QueryAction ,QueryAction 是一个抽象类,它又有如下子类

Elasticsearch通关教程(五):如何通过SQL查询Elasticsearch

可以看出,每个子类对应的就是一个查询的功能,聚合查询,默认查询,删除,哈希连接查询,连接查询,嵌套查询等等。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwypgz.html