ElasticSearch Java API使用
ElasticSearch的Java API中可以通过官方的java.sql和javax.sql包使用JDBC,来进行ElasticSearch中的SQL相关操作。本文对这里的两种API进行说明,具体内容见:ElasticSearch API Usage。
本文内容仅是使用API进行ElasticSearch进行连接,不包括ElasticSearch SQL的具体使用,这部分内容参见ElasticSearch的官方文档的如下内容:
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驱动程序创建的连接不被池化管理。 为了实现池化连接,需要第三方连接池机制。