这节我们来说下如何使用sql来查询es,网上很多使用 NLPChina提供的elasticsearch-sql包,比如gitlab上给出的案例
public void testJDBC() throws Exception {
Properties properties = new Properties();
properties.put("url", "jdbc:elasticsearch://127.0.0.1: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 result = new ArrayList();
while (resultSet.next()) {
System.out.println(resultSet.getString("lastname") + "," + resultSet.getInt("age") + "," + resultSet.getString("gender"))
}
ps.close();
connection.close();
dds.close();
}
不过一切并没有那么顺利,我想也是因为maven中央仓只更新到6.2的版本不匹配的缘故
2020-02-07 16:17:00,965 [Druid-ConnectionPool-Create-1995338497] ERROR c.alibaba.druid.pool.DruidDataSource
[ElasticSearchDruidDataSource.java : 1823] - create connection error
java.lang.NoSuchFieldError: createErrorCount
于是我把elasticsearch-sql代码拉下来,用maven在本地打7.5.1.0版本jar包上传,这时候又报了druid一个方法找不到异常,我将druid也更新到1.1.21的最新版本,接着报:
ERROR c.a.d.p.ElasticSearchDruidDataSource [ElasticSearchDruidDataSource.java : 2508] -
create connection Error
java.lang.NoClassDefFoundError: org/elasticsearch/xpack/client/PreBuiltXPackTransportClient
跟踪下了异常,原来是因为x-pack-transport
的maven依赖在elasticsearch-sql 7.5.1.0包中是
,于是我在项目中加上了依赖:
org.elasticsearch.client
x-pack-transport
7.5.1
不过新版本的ES其实已经废弃PreBuiltXPackTransportClient方式,推荐采用high level api了,而elasticsearch-sql 7.5.1.0仍然在沿用我还是有点疑惑。带着疑惑继续测试又出现其他问题:
ERROR c.a.d.p.ElasticSearchDruidDataSource [ElasticSearchDruidDataSource.java : 2508] - create connection Error
java.lang.NoClassDefFoundError: org/elasticsearch/action/GenericAction
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2671)
[DruidAbstractDataSource.java : 1791] - {dataSource-1} failContinuous is true
从异常来看应该是缺了哪个插件的包,这时我也开始考虑方向问题,就算找到这个包会不会有其他新的bug,普遍存在的一个问题就是所用的ES版本较旧,maven仓没更新也可能是其并不支持。
想了半天还是决定看下官网上有什么建议,毕竟sql的优势es应该也是很看重的。果不其然sql使用有一个章节,我们看到jdbc部分,在pom文件中添加:
org.elasticsearch.client
x-pack-transport
7.5.1
provided
elastic.co
https://artifacts.elastic.co/maven
以为maven中央仓没有上传较新的依赖,所以需要添加下repository。api部分 有接口的使用,我这里还是给个用例。
public void jdbc() throws SQLException {
EsDataSource dataSource = new EsDataSource();
String address = "jdbc:es://192.168.9.226:9200";
dataSource.setUrl(address);
Properties connectionProperties = new Properties();
dataSource.setProperties(connectionProperties);
Connection connection = dataSource.getConnection();
PreparedStatement ps = connection.prepareStatement("select * from sign2 limit 10");
ResultSet resultSet = ps.executeQuery();
List result = new ArrayList();
while (resultSet.next()) {
System.out.println(resultSet.getString("appId"));
}
ps.close();
connection.close();
}
执行可能会遇到下面异常:java.sql.SQLInvalidAuthorizationSpecException: current license is non-compliant for [jdbc]
,这是因为你的es没有授权,打开订阅页 我们可以看到es分了5个等级,我们往下面拉
可以看到,如果要使用jdbc的话,理论上要有白金级的授权才行。
es虽然没有学习版开发所有权限,还是提供了试用的,我们只需要开启授权后也能免费使用30天:
POST /_license/start_trial?acknowledge=true
授权成功后我们可以查看下状态,通过get方式:
GET /_license
当然,如果是我们生产所需,这种试行方式肯定是不行的,下节我们就来看下最新Elasticsearch7的破解方法吧。当然还是建议大家去官网去购买:D