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驅動程序創建的連接不被池化管理。 爲了實現池化連接,需要第三方連接池機制。