Elasticsearch 操作方式总结

1. 使用 Spring Data Elasticsearch

1.1 创建 ArticleRepository

步骤:

  1. 添加依赖: 在 pom.xml 中添加 Spring Data Elasticsearch 依赖。

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
    </dependency>
    
  2. 创建实体类: 定义一个映射到 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;
        }
    }
    
  3. 创建 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 创建客户端

步骤:

  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>
    
  2. 配置客户端: 创建一个配置类来初始化 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 操作。