
java集成ES方式
Elasticsearch 操作方式总结
1. 使用 Spring Data Elasticsearch
1.1 创建 ArticleRepository
步骤:
-
添加依赖: 在
pom.xml
中添加 Spring Data Elasticsearch 依赖。<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency>
-
创建实体类: 定义一个映射到 Elasticsearch 索引的实体类。
import org.springframework.data.annotation.Id; import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.annotations.Field; import org.springframework.data.elasticsearch.annotations.FieldType; @Document(indexName = "article") public class Article { @Id private String id; @Field(type = FieldType.Text) private String title; @Field(type = FieldType.Text) private String content; // Getters and Setters public String getId() { return id; } public void setId(String id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } }
-
创建 Repository 接口: 定义一个接口,继承
ElasticsearchRepository
。import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; public interface ArticleRepository extends ElasticsearchRepository<Article, String> { List<Article> findByTitle(String title); // 自定义查询方法 }
1.2 使用 ArticleRepository
在服务类中使用:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Optional;
@Service
public class ArticleService {
@Autowired
private ArticleRepository articleRepository;
// 添加文档
public Article addArticle(Article article) {
return articleRepository.save(article); // 保存文档到 Elasticsearch
}
// 获取文档
public Optional<Article> getArticle(String id) {
return articleRepository.findById(id); // 根据ID获取文档
}
// 更新文档
public Article updateArticle(Article article) {
return articleRepository.save(article); // 更新文档
}
// 删除文档
public void deleteArticle(String id) {
articleRepository.deleteById(id); // 根据ID删除文档
}
// 搜索文档
public List<Article> searchByTitle(String title) {
return articleRepository.findByTitle(title); // 根据标题搜索文档
}
// 获取所有文档
public List<Article> getAllArticles() {
return (List<Article>) articleRepository.findAll(); // 获取所有文档
}
}
1.3 示例用法
// 示例:添加文章
Article article = new Article();
article.setId("1");
article.setTitle("Elasticsearch Basics");
article.setContent("Introduction to Elasticsearch.");
articleService.addArticle(article);
// 示例:获取文章
Optional<Article> retrievedArticle = articleService.getArticle("1");
retrievedArticle.ifPresent(a -> System.out.println(a.getTitle()));
// 示例:搜索文章
List<Article> articles = articleService.searchByTitle("Elasticsearch");
articles.forEach(a -> System.out.println(a.getTitle()));
1.4 优点
- 简化代码: 通过接口定义和方法命名约定,减少了手动编写查询的复杂性。
- 集成 Spring: 与 Spring Boot 无缝集成,支持自动配置和依赖注入。
2. 使用 Elasticsearch Rest High-Level Client
2.1 创建客户端
步骤:
-
添加依赖: 在
pom.xml
中添加 Elasticsearch REST High-Level Client 依赖。<dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>7.x.x</version> <!-- 替换为适合你的版本 --> </dependency>
-
配置客户端: 创建一个配置类来初始化 Elasticsearch 客户端。
import org.apache.http.HttpHost; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestHighLevelClient; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class ElasticSearchConfig { @Bean public RestHighLevelClient client() { return new RestHighLevelClient( RestClient.builder(new HttpHost("localhost", 9200, "http"))); // 配置 Elasticsearch 地址 } }
2.2 使用客户端
在服务类中使用:
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.IOException;
@Service
public class ArticleService {
@Autowired
private RestHighLevelClient client;
// 添加文档
public void addArticle(Article article) throws IOException {
IndexRequest request = new IndexRequest("article")
.id(article.getId())
.source(XContentType.JSON, "title", article.getTitle(), "content", article.getContent());
client.index(request, RequestOptions.DEFAULT); // 保存文档到 Elasticsearch
}
// 获取文档
public Article getArticle(String id) throws IOException {
GetRequest getRequest = new GetRequest("article", id);
GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);
if (getResponse.isExists()) {
Map<String, Object> sourceAsMap = getResponse.getSourceAsMap();
Article article = new Article();
article.setId(id);
article.setTitle((String) sourceAsMap.get("title"));
article.setContent((String) sourceAsMap.get("content"));
return article; // 返回获取的文档
} else {
return null; // 文档不存在
}
}
// 删除文档
public void deleteArticle(String id) throws IOException {
DeleteRequest deleteRequest = new DeleteRequest("article", id);
client.delete(deleteRequest, RequestOptions.DEFAULT); // 根据ID删除文档
}
// 更新文档
public void updateArticle(Article article) throws IOException {
IndexRequest request = new IndexRequest("article")
.id(article.getId())
.source(XContentType.JSON, "title", article.getTitle(), "content", article.getContent());
client.index(request, RequestOptions.DEFAULT); // 更新文档
}
// 其他操作...
}
2.3 示例用法
// 示例:添加文章
Article article = new Article();
article.setId("1");
article.setTitle("Elasticsearch Basics");
article.setContent("Introduction to Elasticsearch.");
articleService.addArticle(article);
// 示例:获取文章
Article retrievedArticle = articleService.getArticle("1");
System.out.println(retrievedArticle.getTitle());
// 示例:更新文章
article.setContent("Updated content for Elasticsearch.");
articleService.updateArticle(article);
// 示例:删除文章
articleService.deleteArticle("1");
2.4 优点
- 灵活性: 直接使用 REST API,适合需要细粒度控制的场景。
- 功能全面: 支持所有 Elasticsearch 功能,包括复杂的查询和聚合。
总结
ArticleRepository
- 来源: 通过 Spring Data Elasticsearch 提供的功能创建,自动实现 CRUD 操作。
- 实现方式: 通过接口定义和 Spring 的依赖注入,简化数据访问。
Elasticsearch Rest High-Level Client
- 来源: Elasticsearch 官方提供的 Java 客户端,直接操作 Elasticsearch REST API。
- 实现方式: 手动创建请求并发送到 Elasticsearch,适合需要更高灵活性的场景。
这两种方式各有优缺点,开发者可以根据具体需求选择合适的方式进行 Elasticsearch 操作。
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 王德明
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果