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.yml
或 application.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=Spring
或GET /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应用程序,并进行测试操作。