Elasticsearch 在 Java 中的使用教程
时间: 2025-07-15 21:13:44 浏览: 5
<think>我们使用Elasticsearch的Java客户端有两种主要方式:使用TransportClient(在7.0.0版本中已被弃用,8.0版本中移除)和RestHighLevelClient(官方推荐)。由于TransportClient已经不再推荐,本教程将使用RestHighLevelClient。同时,注意在Elasticsearch 7.15之后,官方开始推荐使用新的Java客户端(elasticsearch-java),但RestHighLevelClient仍被广泛使用。本教程以RestHighLevelClient为例。
步骤:
1. 添加Maven依赖
2. 创建客户端
3. 索引文档
4. 搜索文档
5. 关闭客户端
注意:本教程基于Elasticsearch 7.x版本。如果使用8.x版本,配置会有所不同(主要是安全设置)。
假设我们有一个Elasticsearch集群运行在localhost:9200。
1. 添加Maven依赖(在pom.xml中):
```xml
<dependencies>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.17.3</version> <!-- 请根据你的Elasticsearch版本选择 -->
</dependency>
<!-- 如果使用log4j2,可能需要添加日志依赖,避免警告 -->
</dependencies>
```
2. 创建客户端:
```java
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
public class ElasticsearchClient {
public static void main(String[] args) {
// 创建客户端
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http")));
// 使用客户端...
// 关闭客户端
try {
client.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
```
3. 索引文档(将数据存入Elasticsearch):
假设我们要索引一个简单的文档(例如,一个代表用户的对象)到名为"users"的索引中。
```java
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.rest.RestStatus;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class IndexDocumentExample {
public static void main(String[] args) throws IOException {
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http")));
// 创建一个Map来模拟JSON对象
Map<String, Object> jsonMap = new HashMap<>();
jsonMap.put("name", "John Doe");
jsonMap.put("age", 30);
jsonMap.put("city", "New York");
IndexRequest request = new IndexRequest("users")
.id("1") // 文档id,如果不设置,Elasticsearch会自动生成
.source(jsonMap, XContentType.JSON); // 数据源
try {
IndexResponse response = client.index(request, RequestOptions.DEFAULT);
RestStatus status = response.status();
if (status == RestStatus.CREATED) {
System.out.println("文档索引成功!");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
client.close();
}
}
}
```
4. 搜索文档:
我们搜索索引"users"中城市为"New York"的用户。
```java
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import java.io.IOException;
public class SearchDocumentExample {
public static void main(String[] args) throws IOException {
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http")));
SearchRequest searchRequest = new SearchRequest("users");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.matchQuery("city", "New York"));
searchRequest.source(sourceBuilder);
try {
SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
for (SearchHit hit : response.getHits().getHits()) {
System.out.println(hit.getSourceAsString());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
client.close();
}
}
}
```
5. 关闭客户端:在finally块中关闭客户端,确保资源释放。
注意:在实际生产环境中,可能需要处理Elasticsearch的安全设置(如SSL和用户名密码),这里为了简单省略了。
以上是使用RestHighLevelClient的基本操作。请注意,Elasticsearch官方正在逐步迁移到新的Java客户端(基于Java API Client),但RestHighLevelClient在现有项目中仍然非常常见。
另外,由于Elasticsearch的版本更新较快,请确保客户端版本与Elasticsearch服务器版本一致,以避免兼容性问题。
§§相关问题§§:
1. 如何在Elasticsearch Java客户端中处理批量操作(Bulk)?
2. 在Elasticsearch中,如何更新和删除文档?
3. 如何配置Elasticsearch Java客户端以连接到安全的集群(使用HTTPS和认证)?
4. 在Elasticsearch 8.x中,新的Java客户端(elasticsearch-java)与RestHighLevelClient有何不同?如何迁移?</think>### Elasticsearch 在 Java 中的使用教程
以下是使用 Elasticsearch Java 客户端(基于 `RestHighLevelClient`)的完整步骤:
#### 1. **添加 Maven 依赖**
```xml
<dependencies>
<!-- Elasticsearch 客户端 -->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.17.3</version> <!-- 与 ES 服务版本一致 -->
</dependency>
<!-- JSON 处理库 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.0</version>
</dependency>
</dependencies>
```
#### 2. **创建客户端连接**
```java
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
public class ESClient {
public static RestHighLevelClient createClient() {
return new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
}
}
```
#### 3. **索引文档(保存数据)**
```java
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.common.xcontent.XContentType;
public class IndexExample {
public static void main(String[] args) throws Exception {
try (RestHighLevelClient client = ESClient.createClient()) {
// 1. 构建文档数据(JSON格式)
String json = "{\"name\":\"Alice\",\"age\":28,\"interests\":[\"hiking\",\"coding\"]}";
// 2. 创建索引请求
IndexRequest request = new IndexRequest("users") // 索引名
.id("1") // 文档ID(可选)
.source(json, XContentType.JSON);
// 3. 执行请求
IndexResponse response = client.index(request, RequestOptions.DEFAULT);
System.out.println("文档ID: " + response.getId());
}
}
}
```
#### 4. **搜索文档**
```java
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
public class SearchExample {
public static void main(String[] args) throws Exception {
try (RestHighLevelClient client = ESClient.createClient()) {
// 1. 构建搜索请求
SearchRequest request = new SearchRequest("users");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// 2. 添加查询条件(匹配"name"字段)
sourceBuilder.query(QueryBuilders.matchQuery("name", "Alice"));
request.source(sourceBuilder);
// 3. 执行搜索
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 4. 处理结果
for (SearchHit hit : response.getHits().getHits()) {
System.out.println("找到文档: " + hit.getSourceAsString());
}
}
}
}
```
#### 5. **更新文档**
```java
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.common.xcontent.XContentType;
public class UpdateExample {
public static void main(String[] args) throws Exception {
try (RestHighLevelClient client = ESClient.createClient()) {
UpdateRequest request = new UpdateRequest("users", "1")
.doc("{\"age\":29}", XContentType.JSON); // 更新age字段
UpdateResponse response = client.update(request, RequestOptions.DEFAULT);
System.out.println("更新版本号: " + response.getVersion());
}
}
}
```
#### 6. **删除文档**
```java
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
public class DeleteExample {
public static void main(String[] args) throws Exception {
try (RestHighLevelClient client = ESClient.createClient()) {
DeleteRequest request = new DeleteRequest("users", "1");
DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);
System.out.println("文档已删除: " + response.getId());
}
}
}
```
---
### 关键概念解释
1. **索引(Index)**
- 类似数据库中的“表”,用于存储相同结构的文档。
- 示例:`users` 索引存储用户数据。
2. **文档(Document)**
- 索引中的基本数据单元(JSON 格式),如一个用户信息。
3. **`RestHighLevelClient`**
- 官方推荐的 Java 客户端(注意:8.x 版本已迁移到新客户端)。
- 通过 HTTP 与 Elasticsearch 集群通信。
4. **操作流程**
- 创建请求对象(如 `IndexRequest`)→ 设置参数 → 执行请求 → 处理响应。
5. **版本兼容性**
- 客户端版本必须与 Elasticsearch 服务端版本一致(如 7.17.x 对应 ES 7.17.x)。
---
### 常见问题及解决
1. **连接失败**
- 检查 ES 是否运行(`curl http://localhost:9200`)。
- 确认防火墙开放 9200 端口。
2. **版本冲突**
- 客户端与服务端版本不一致会导致 `NoNodeAvailableException`。
3. **JSON 序列化**
- 使用 `jackson-databind` 将 Java 对象转为 JSON:
```java
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(userObject);
```
4. **认证问题(如启用安全模式)**
- 在 `RestClient.builder()` 中添加凭证:
```java
CredentialsProvider provider = new BasicCredentialsProvider();
provider.setCredentials(AuthScope.ANY,
new UsernamePasswordCredentials("username", "password"));
RestClient.builder(new HttpHost("localhost", 9200))
.setHttpClientConfigCallback(c -> c.setDefaultCredentialsProvider(provider));
```
---
阅读全文
相关推荐


















