API 使用

编辑

可以使用官方的 java.sqljavax.sql 包来使用 JDBC。

java.sql

编辑

前者通过 java.sql.DriverDriverManager

String address = "jdbc:es://" + elasticsearchAddress;     
Properties connectionProperties = connectionProperties(); 
Connection connection =
    DriverManager.getConnection(address, connectionProperties);

Elasticsearch 监听 HTTP 流量的服务器和端口。默认端口为 9200。

连接 Elasticsearch 的属性。对于未经安全保护的 Elasticsearch,空的 Properties 实例即可。

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();

Elasticsearch 监听 HTTP 流量的服务器和端口。默认端口为 9200。

连接 Elasticsearch 的属性。对于未经安全保护的 Elasticsearch,空的 Properties 实例即可。

使用哪一个?通常,在 URL 中提供大多数配置属性的客户端应用程序依赖于 DriverManager 样式,而当 DataSource传递时,则优先使用 DataSource,因为它可以在一个地方进行配置,并且使用者只需要调用 getConnection 而无需担心任何其他属性。

要连接到受保护的 Elasticsearch 服务器,Properties 应如下所示:

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

获得连接后,您可以像使用任何其他 JDBC 连接一样使用它。例如:

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 驱动程序创建的连接不会被池化。为了实现池化连接,需要使用第三方连接池机制。配置和设置第三方提供程序不在本文档范围之内。