 
            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 协议,完整转载请注明来自 王德明
        
     评论
            
                匿名评论
                隐私政策
            
            
                你无需删除空行,直接评论以获取最佳展示效果
            
         
            
         
        
    