Hướng Dẫn Sử Dụng Java Client API của Elasticsearch (Transport Client)
Elasticsearch là một công cụ tìm kiếm mạnh mẽ, và từ những phiên bản đầu tiên, nó đã cung cấp một Java Client API chuyên dụng, được gọi là transport client. API này cho phép giao tiếp với Elasticsearch cluster thông qua native transport protocol. Điều quan trọng là phiên bản của thư viện client phải tương thích với phiên bản của Elasticsearch distribution mà bạn đang sử dụng, lý tưởng nhất là nên sử dụng cùng một phiên bản.
Trong bài viết này, chúng ta sẽ làm việc với Elasticsearch 5.2.0, vì vậy hãy cùng thêm dependency tương ứng vào tệp pom.xml
của bạn.
xml
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>5.2.0</version>
</dependency>
Cấu Hình Transport Client Trong Spring Framework
Nếu bạn đang làm việc với Spring Framework, bạn chỉ cần cấu hình một TransportClient bean như sau:
java
@Configuration
public class ElasticsearchClientConfiguration {
@Bean(destroyMethod = "close")
TransportClient transportClient() throws UnknownHostException {
return new PreBuiltTransportClient(
Settings.builder()
.put(ClusterName.CLUSTER_NAME_SETTING.getKey(), "es-catalog")
.build()
).addTransportAddress(new InetSocketTransportAddress(
InetAddress.getByName("localhost"), 9300
));
}
}
Lưu ý rằng giá trị của CLUSTER_NAME_SETTING
phải khớp chính xác với tên của Elasticsearch cluster mà bạn đang kết nối. Đối với ví dụ này, tên cluster là "es-catalog".
Khi TransportClient đã được khởi tạo, bạn có thể dễ dàng truy cập nó trong các thành phần khác của ứng dụng thông qua Spring Dependency Injection như sau:
java
@Autowired
private TransportClient client;
Giao Tiếp Với Elasticsearch Bằng Transport Client
Transport Client cung cấp một loạt phương thức mạnh mẽ để truy cập các API của Elasticsearch theo phong cách fluent interface. Ví dụ, kiểm tra tình trạng của cluster:
java
final ClusterHealthResponse response = client
.admin()
.cluster()
.health(
Requests.clusterHealthRequest()
.waitForGreenStatus()
.timeout(TimeValue.timeValueSeconds(5))
)
.actionGet();
assertThat(response.isTimedOut())
.withFailMessage("Cluster không khỏe: %s", response.getStatus())
.isFalse();
Trong ví dụ này, chúng ta yêu cầu Elasticsearch cluster trả về trạng thái health của nó, đồng thời chờ tối đa 5 giây để nó trở về trạng thái "green".
Thực Thi Bất Đồng Bộ
Các API của Elasticsearch Java Client được thiết kế để hỗ trợ asynchronous execution, với hai lớp chính:
- **ActionFuture>**: Tương tự như Java Future>, nhưng bổ sung thêm các phương thức hữu ích.
- ListenableActionFuture<?>: Hỗ trợ đăng ký callbacks để xử lý kết quả ngay khi chúng sẵn sàng.
Bạn có thể chọn kiểu nào tùy theo nhu cầu của ứng dụng. Dưới đây là ví dụ về cách sử dụng prepareHealth()
thay vì clusterHealthRequest()
:
java
final ClusterHealthResponse response = client
.admin()
.cluster()
.prepareHealth()
.setWaitForGreenStatus()
.setTimeout(TimeValue.timeValueSeconds(5))
.execute()
.actionGet();
Tóm Tắt
- Elasticsearch Java Client API cung cấp một cách mạnh mẽ để giao tiếp với Elasticsearch cluster.
- Spring Framework giúp đơn giản hóa cấu hình và quản lý Transport Client.
- Bạn có thể chọn giữa synchronous hoặc asynchronous execution tùy theo nhu cầu của ứng dụng.
Trong phần tiếp theo, chúng ta sẽ khám phá Java REST Client, một lựa chọn thay thế không phụ thuộc vào phiên bản của Elasticsearch. 🚀