最新elasticsearch7(三、jdbc链接sql查询)

文章目录

    • 采坑
    • 新方案
    • 结尾

采坑

这节我们来说下如何使用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包中是provided,于是我在项目中加上了依赖:

		
            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个等级,我们往下面拉
最新elasticsearch7(三、jdbc链接sql查询)_第1张图片
可以看到,如果要使用jdbc的话,理论上要有白金级的授权才行。
最新elasticsearch7(三、jdbc链接sql查询)_第2张图片
es虽然没有学习版开发所有权限,还是提供了试用的,我们只需要开启授权后也能免费使用30天:

POST /_license/start_trial?acknowledge=true

授权成功后我们可以查看下状态,通过get方式:

GET /_license

结尾

当然,如果是我们生产所需,这种试行方式肯定是不行的,下节我们就来看下最新Elasticsearch7的破解方法吧。当然还是建议大家去官网去购买:D

你可能感兴趣的:(大数据,Elasticsearch)