Elasticsearch Java 客户端:完整指南
Elasticsearch 是一个基于 Apache Lucene 构建的强大分布式搜索与分析引擎。为了从 Java 应用程序中集成 Elasticsearch,Elastic 公司提供了官方的 Elasticsearch Java Client(此前称为 High-Level REST Client)。本文将详细讲解如何使用该客户端执行核心操作:连接、文档索引、CRUD 操作以及全文搜索。
什么是 Elasticsearch Java Client?
Elasticsearch Java Client 是一个现代、类型安全的 API,用于从 Java 与 Elasticsearch 进行交互。它基于异步 HTTP 客户端构建,支持从 7.x 开始的所有 Elasticsearch 版本。主要优势包括:
- 全面支持所有 Elasticsearch API(索引、搜索、聚合、集群管理)。
- 异步与响应式——内置对 CompletableFuture 和响应式流的支持。
- 类型安全的 DSL 查询——在编译阶段最大限度减少错误。
- 配置简单——依赖项数量最少。
安装与配置
要在 Maven 项目中引入该客户端,请在 pom.xml 中添加以下依赖:
<dependency> <groupId>co.elastic.clients</groupId> <artifactId>elasticsearch-java</artifactId> <version>8.15.0</version></dependency>对于 Gradle(build.gradle):
implementation 'co.elastic.clients:elasticsearch-java:8.15.0'此外,还需要 Jackson 用于 JSON 的序列化/反序列化:
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.17.0</version></dependency>创建客户端与连接
要创建客户端,需要指定 Elasticsearch 的主机和端口。以下是基本配置示例:
import co.elastic.clients.elasticsearch.ElasticsearchClient;import co.elastic.clients.json.jackson.JacksonJsonpMapper;import co.elastic.clients.transport.rest_client.RestClientTransport;import org.apache.http.Header;import org.apache.http.message.BasicHeader;import org.elasticsearch.client.RestClient;
public class ElasticsearchExample {
public static ElasticsearchClient createClient() { // 创建低层级 REST 客户端 RestClient restClient = RestClient.builder( new HttpHost("localhost", 9200, "http") ).setDefaultHeaders(new Header[]{ new BasicHeader("Content-Type", "application/json") }).build();
// 使用 Jackson 映射器的传输层 RestClientTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
// 高层级客户端 return new ElasticsearchClient(transport); }
public static void main(String[] args) throws IOException { ElasticsearchClient client = createClient(); System.out.println("客户端创建成功!"); client.close(); }}索引操作
在开始工作之前,需要先创建索引。以下是创建带映射的索引示例:
public static void createIndex(ElasticsearchClient client, String indexName) throws IOException { client.indices().create(c -> c .index(indexName) .mappings(m -> m .properties("title", p -> p.text(t -> t)) .properties("content", p -> p.text(t -> t)) .properties("price", p -> p.double_(d -> d)) .properties("createdAt", p -> p.date(d -> d))