Elasticsearch 8.17.1 java 创建一个可以执行的例子 注意每一步仔细实现情况
时间: 2025-06-08 13:48:27 浏览: 17
<think>好的,用户需要关于Elasticsearch 8.17.1在Java中创建可执行示例的详细步骤。首先,我得确保自己了解Elasticsearch 8.x版本的变化,特别是Java客户端方面的更新。记得在7.x之后,High Level REST Client被弃用,推荐使用新的Java API Client,基于JSON的请求体构建。
用户可能对Elasticsearch不太熟悉,所以需要从环境搭建开始。应该先指导他们创建Maven项目,添加正确的依赖。Elasticsearch 8.17.1对应的Java客户端版本应该也是8.17.1,需要确认groupId和artifactId是否正确,避免版本冲突。
接下来是初始化客户端的部分。需要提到安全连接,因为8.x默认启用SSL,可能需要处理证书或者禁用SSL验证(虽然生产环境不推荐,但示例中可以简化)。这里要提供两种方法:使用本地CA证书或者暂时关闭SSL,方便用户测试。
然后是创建索引、插入文档、搜索等操作。每个步骤都需要详细的代码示例,特别是使用新的API方式,比如用co.elastic.clients.elasticsearch.core.IndexRequest。要注意到用户可能需要处理异常,所以代码中需要包含try-catch块,并正确关闭客户端。
用户可能需要了解如何构建查询,这里用Match查询作为例子比较合适。同时,要展示如何处理返回结果,提取命中数据。此外,索引创建时需要指定映射,但示例中可以简化,让Elasticsearch自动生成映射,除非用户有特定需求。
最后,确保整个示例可以运行,包括必要的异常处理和资源清理。提醒用户注意版本匹配和配置的正确性,比如主机名、端口、认证信息等。可能还需要提到常见的坑,比如依赖冲突、SSL配置错误,或者网络问题导致连接不上。
需要检查步骤是否全面,是否覆盖了从项目搭建到执行查询的整个流程。代码示例是否准确,特别是使用新API的部分,避免使用过时的类或方法。同时,确保说明清晰,用户能一步步跟着操作,不会在配置环节卡住。可能还需要建议用户查看Elasticsearch官方文档,以获取更多细节和最佳实践。</think>以下是在Java中创建Elasticsearch 8.17.1可执行示例的详细步骤(使用Java API Client):
1. **创建Maven项目**(需提前安装JDK 8+和Maven)
```xml
<!-- pom.xml 依赖 -->
<dependencies>
<dependency>
<groupId>co.elastic.clients</groupId>
<artifactId>elasticsearch-java</artifactId>
<version>8.17.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version>
</dependency>
</dependencies>
```
2. **初始化客户端**(处理HTTPS连接)
```java
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import co.elastic.clients.transport.ElasticsearchTransport;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.elasticsearch.client.RestClient;
public class ElasticsearchExample {
private static ElasticsearchClient createClient() {
// 如果启用了安全配置(默认开启)
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY,
new UsernamePasswordCredentials("elastic", "your_password")); // 替换实际密码
// 创建低级客户端
RestClient restClient = RestClient.builder(
new HttpHost("localhost", 9200, "https"))
.setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder
.setSSLContext(SSLContexts.createSystemDefault()) // 信任自签名证书
.setDefaultCredentialsProvider(credentialsProvider))
.build();
// 创建传输层
ElasticsearchTransport transport = new RestClientTransport(
restClient, new JacksonJsonpMapper());
return new ElasticsearchClient(transport);
}
}
```
3. **创建索引**
```java
public static void createIndex(ElasticsearchClient client) throws IOException {
client.indices().create(c -> c
.index("products")
.settings(s -> s
.numberOfShards("1")
.numberOfReplicas("0")
)
.mappings(m -> m
.properties("name", p -> p.text(t -> t.analyzer("standard")))
.properties("price", p -> p.double_(d -> d))
)
);
System.out.println("索引创建成功");
}
```
4. **插入文档**
```java
public static void indexDocument(ElasticsearchClient client) throws IOException {
Product product = new Product("手机", 2999.99);
IndexResponse response = client.index(i -> i
.index("products")
.id("1")
.document(product)
);
System.out.println("文档索引成功,版本:" + response.version());
}
// 数据对象类
static class Product {
public String name;
public double price;
public Product(String name, double price) {
this.name = name;
this.price = price;
}
}
```
5. **执行搜索**
```java
public static void searchProducts(ElasticsearchClient client) throws IOException {
SearchResponse<Product> response = client.search(s -> s
.index("products")
.query(q -> q
.match(m -> m
.field("name")
.query("手机")
)
),
Product.class
);
for (Hit<Product> hit : response.hits().hits()) {
Product product = hit.source();
System.out.printf("找到商品:%s,价格:%.2f%n",
product.name, product.price);
}
}
```
6. **主程序**
```java
public static void main(String[] args) {
try (ElasticsearchClient client = createClient()) {
createIndex(client);
indexDocument(client);
// 等待索引刷新(生产环境应使用异步等待)
Thread.sleep(1000);
searchProducts(client);
} catch (Exception e) {
e.printStackTrace();
}
}
```
**注意事项**:
1. 安全配置:Elasticsearch 8默认启用HTTPS和认证
- 需要配置正确的证书(开发环境可禁用验证,但不建议)
- 修改`elasticsearch.yml`中的`xpack.security.enabled: false`可关闭安全功能(仅限测试)
2. 连接配置需匹配:
- 确保`localhost:9200`与实际ES实例地址一致
- 用户名密码需与ES配置匹配(默认用户`elastic`)
3. 版本严格对应:
- Java客户端版本必须与ES服务端版本完全一致(8.17.1)
4. 生产环境建议:
- 使用连接池配置
- 添加重试机制
- 使用异步操作提升性能
- 启用安全传输层(TLS)
可以通过运行`mvn compile exec:java -Dexec.mainClass="ElasticsearchExample"`执行示例
阅读全文