ElasticSearch Java SQL API基本使用

ElasticSearch Java API使用

ElasticSearch的Java API中可以通过官方的java.sql和javax.sql包使用JDBC,来进行ElasticSearch中的SQL相关操作。本文对这里的两种API进行说明,具体内容见:ElasticSearch API Usage。

本文内容仅是使用API进行ElasticSearch进行连接,不包括ElasticSearch SQL的具体使用,这部分内容参见ElasticSearch的官方文档的如下内容:

  • Getting Started with SQL
  • SQL Language

java.sql包

java.sql包中,通过java.sql.Driver和DriverManager来进行ES的连接,并进行SQL操作。

String address = "jdbc:es://" + elasticsearchAddress;     
Properties connectionProperties = connectionProperties(); 
Connection connection =
    DriverManager.getConnection(address, connectionProperties);
  • Elasticsearch服务监听HTTP的服务器和端口,端口默认为9200。
  • 对于连接到Elasticsearch的属性,对于不安全的Elasticsearch可以使用空属性,

javax.sql包

使用javax.sql包,则可通过javax.sql.DataSource API进行访问:

EsDataSource dataSource = new EsDataSource();
String address = "jdbc:es://" + elasticsearchAddress;     
dataSource.setUrl(address);
Properties connectionProperties = connectionProperties(); 
dataSource.setProperties(connectionProperties);
Connection connection = dataSource.getConnection();

API的选择和使用示例

那么以上连个Java API使用哪一个? 一般情况下:

  • DriverManager样式:适用于在URL中提供大多数配置属性的客户端应用程序,
  • DataSource样式:适用于配置在多个位置进行传递,这种方式可以在一个位置进行配置,多个使用者只需调用getConnection即可,而不必担心任何其他属性。

如果需要连接到受保护的Elasticsearch服务器,连接时的属性需要配置如下:

Properties properties = new Properties();
properties.put("user", "test_admin");
properties.put("password", "x-pack-test-password");

使用以上的API建立连接后,就可以像其他任何JDBC连接一样使用ElasticSearch的Java API了, 例如:

try (Statement statement = connection.createStatement();
        ResultSet results = statement.executeQuery(
              "   SELECT name, page_count"
            + "     FROM library"
            + " ORDER BY page_count DESC"
            + "    LIMIT 1")) {
    assertTrue(results.next());
    assertEquals("Don Quixote", results.getString(1));
    assertEquals(1072, results.getInt(2));
    SQLException e = expectThrows(SQLException.class, () ->
        results.getInt(1));
    assertThat(e.getMessage(), containsString("Unable to convert "
            + "value [Don Quixote] of type [TEXT] to [Integer]"));
    assertFalse(results.next());
}

主要注意的是,Elasticsearch SQL不提供连接池机制,因此JDBC驱动程序创建的连接不被池化管理。 为了实现池化连接,需要第三方连接池机制。

你可能感兴趣的:(ElasticSearch)