springboot集成Elasticsearch

1. 创建 Spring Boot 项目

你可以使用 Spring Initializr 创建一个新的 Spring Boot 项目,选择以下依赖项:

  • Spring Web
  • Spring Data Elasticsearch
  • Lombok(可选)
  • Spring Boot DevTools(可选)

2. Maven 配置

pom.xml 中,添加 Elasticsearch 相关的依赖:

<dependencies>
    <!-- Spring Boot Starter Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Spring Data Elasticsearch -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
    </dependency>

    <!-- Lombok for easier code (optional) -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <scope>provided</scope>
    </dependency>

    <!-- Spring Boot DevTools for development (optional) -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
    </dependency>

    <!-- Test dependencies -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

3. 配置 Elasticsearch

application.ymlapplication.properties 中配置 Elasticsearch 的连接信息:

spring:
  data:
    elasticsearch:
      client:
        reactive:
          endpoints: localhost:9200
      repositories:
        enabled: true

4. 定义实体类

创建一个表示要索引到 Elasticsearch 中的实体类,例如 Article

import lombok.Data;
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;

import java.util.Date;

@Data
@Document(indexName = "articles")
public class Article {

    @Id
    private String id;

    @Field(type = FieldType.Text)
    private String title;

    @Field(type = FieldType.Text)
    private String content;

    @Field(type = FieldType.Keyword)
    private String author;

    @Field(type = FieldType.Date)
    private Date publishDate;
}

在上面的代码中:

  • @Document 注解标记这个类作为 Elasticsearch 的文档,indexName 指定了索引的名称。
  • @Id 注解表示这个字段是文档的唯一标识符。
  • @Field 注解用于指定字段的类型以及在 Elasticsearch 中的存储方式。

5. 创建存储库接口

创建一个存储库接口来与 Elasticsearch 交互。这个接口继承自 ElasticsearchRepository,并为 Article 实体提供基本的 CRUD 操作。

import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

import java.util.List;

public interface ArticleRepository extends ElasticsearchRepository<Article, String> {
    List<Article> findByTitle(String title);
    List<Article> findByAuthor(String author);
}

6. 实现服务层

接下来,创建一个服务类来处理业务逻辑。这个服务类将使用 ArticleRepository 来与 Elasticsearch 交互。

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 saveArticle(Article article) {
        return articleRepository.save(article);
    }

    public Optional<Article> findArticleById(String id) {
        return articleRepository.findById(id);
    }

    public List<Article> findArticlesByTitle(String title) {
        return articleRepository.findByTitle(title);
    }

    public List<Article> findArticlesByAuthor(String author) {
        return articleRepository.findByAuthor(author);
    }

    public void deleteArticle(String id) {
        articleRepository.deleteById(id);
    }

    public Iterable<Article> findAllArticles() {
        return articleRepository.findAll();
    }
}

在这个服务类中,我们定义了几个常见的操作:

  • saveArticle(Article article):保存一个新的 Article 到 Elasticsearch。
  • findArticleById(String id):通过 id 查找文章。
  • findArticlesByTitle(String title):通过 title 查找文章列表。
  • findArticlesByAuthor(String author):通过 author 查找文章列表。
  • deleteArticle(String id):删除指定 id 的文章。
  • findAllArticles():返回所有的文章。

7. 创建控制器

为了测试和展示如何使用这些服务,我们创建一个 REST 控制器。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.Date;
import java.util.List;
import java.util.Optional;

@RestController
@RequestMapping("/api/articles")
public class ArticleController {

    @Autowired
    private ArticleService articleService;

    @PostMapping
    public ResponseEntity<Article> createArticle(@RequestBody Article article) {
        article.setPublishDate(new Date());
        Article savedArticle = articleService.saveArticle(article);
        return new ResponseEntity<>(savedArticle, HttpStatus.CREATED);
    }

    @GetMapping("/{id}")
    public ResponseEntity<Article> getArticleById(@PathVariable String id) {
        Optional<Article> article = articleService.findArticleById(id);
        return article.map(ResponseEntity::ok).orElseGet(() -> new ResponseEntity<>(HttpStatus.NOT_FOUND));
    }

    @GetMapping("/search")
    public ResponseEntity<List<Article>> searchArticles(
            @RequestParam(value = "title", required = false) String title,
            @RequestParam(value = "author", required = false) String author) {

        List<Article> articles;
        if (title != null) {
            articles = articleService.findArticlesByTitle(title);
        } else if (author != null) {
            articles = articleService.findArticlesByAuthor(author);
        } else {
            return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
        }

        return new ResponseEntity<>(articles, HttpStatus.OK);
    }

    @DeleteMapping("/{id}")
    public ResponseEntity<Void> deleteArticle(@PathVariable String id) {
        articleService.deleteArticle(id);
        return new ResponseEntity<>(HttpStatus.NO_CONTENT);
    }

    @GetMapping
    public ResponseEntity<Iterable<Article>> getAllArticles() {
        Iterable<Article> articles = articleService.findAllArticles();
        return new ResponseEntity<>(articles, HttpStatus.OK);
    }
}

8. 测试应用

启动 Spring Boot 应用程序并测试 REST API:

  • 创建文章:使用 POST /api/articles 请求创建一个新文章。
curl -X POST "http://localhost:8080/api/articles" -H "Content-Type: application/json" -d '{
  "title": "Spring Boot Elasticsearch",
  "content": "This is a tutorial for integrating Elasticsearch with Spring Boot.",
  "author": "John Doe"
}'
  • 获取文章:使用 GET /api/articles/{id} 请求获取特定 ID 的文章。
curl -X GET "http://localhost:8080/api/articles/{id}"
  • 搜索文章:使用 GET /api/articles/search?title=SpringGET /api/articles/search?author=John 搜索文章。
curl -X GET "http://localhost:8080/api/articles/search?title=Spring"
  • 删除文章:使用 DELETE /api/articles/{id} 删除指定 ID 的文章。
curl -X DELETE "http://localhost:8080/api/articles/{id}"
  • 获取所有文章:使用 GET /api/articles 获取所有文章。
curl -X GET "http://localhost:8080/api/articles"

9. 结论

步骤总结如下:

首先,确保你已经有一个运行的Elasticsearch集群,并且能够通过HTTP访问到它。如果没有,请先安装和配置Elasticsearch。

创建一个Spring Boot项目,并添加Elasticsearch的依赖。可以使用Maven或者Gradle来管理依赖。

在Spring Boot的配置文件中,添加Elasticsearch的配置。主要包括Elasticsearch集群的地址和端口。

创建一个Elasticsearch的客户端配置类,用于创建Elasticsearch的客户端连接。可以使用TransportClient或者RestClient来创建连接。

编写一个Elasticsearch的数据访问层接口,用于定义对Elasticsearch的操作方法。可以使用Spring Data Elasticsearch来简化操作。

实现数据访问层接口,具体实现对Elasticsearch的操作方法。

在业务逻辑层中调用数据访问层的方法,来进行对Elasticsearch的数据操作。

运行Spring Boot应用程序,并进行测试操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值