Spring Boot 集成 ElasticSearch

2年前 (2022) 程序员胖胖胖虎阿
247 0 0
点击上方蓝色字体,选择“标星公众号”
优质文章,第一时间送达
Spring Boot 集成 ElasticSearch
作者 | ZeroOne01

链接 | blog.51cto.com/zero01/2134718

Spring Boot集成ElasticSearch

pom.xml文件中,依赖的各jar包版本如下:
<parent>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-parent</artifactId>    <version>2.0.3.RELEASE</version>    <relativePath/> <!-- lookup parent from repository --></parent>
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <elasticsearch.version>5.5.2</elasticsearch.version></properties>
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>transport</artifactId> <version>${elasticsearch.version}</version> </dependency></dependencies>

在工程中新建一个config包,在该包中创建一个ESConfig配置类,用于构造es的客户端实例对象。代码如下:
@Configurationpublic class ESConfig {
@Bean public TransportClient client() throws UnknownHostException { // 9300是es的tcp服务端口 InetSocketTransportAddress node = new InetSocketTransportAddress( InetAddress.getByName("192.168.190.129"), 9300);
// 设置es节点的配置信息 Settings settings = Settings.builder() .put("cluster.name", "es") .build();
// 实例化es的客户端对象 TransportClient client = new PreBuiltTransportClient(settings); client.addTransportAddress(node);
return client; }}

查询接口开发
我现在有一个结构化的索引如下:

Spring Boot 集成 ElasticSearch

该索引中有一些文档数据,如下:

Spring Boot 集成 ElasticSearch

在工程中新建一个controller包,在该包中新建一个 BookCrudController 类,用于演示es增删查改接口demo。我们首先来开发查询接口,代码如下:
@RestController@RequestMapping("/es/demo")public class BookCrudController {
@Autowired private TransportClient client;
/** * 按id查询 * @param id * @return */ @GetMapping("/get/book/novel") public ResponseEntity searchById(@RequestParam("id") String id) { if (id.isEmpty()) { return new ResponseEntity(HttpStatus.NOT_FOUND); }
// 通过索引、类型、id向es进行查询数据 GetResponse response = client.prepareGet("book", "novel", id).get();
if (!response.isExists()) { return new ResponseEntity(HttpStatus.NOT_FOUND); }
// 返回查询到的数据 return new ResponseEntity(response.getSource(), HttpStatus.OK); }}

启动SpringBoot工程,使用postman进行测试,查询结果如下:

Spring Boot 集成 ElasticSearch

新增接口开发
在 BookCrudController 类中开发新增接口,代码如下:
@PostMapping("/add/book/novel")public ResponseEntity add(@RequestParam("title") String title,                          @RequestParam("author") String author,                          @RequestParam("word_count") int wordCount,                          @RequestParam("publish_date")                          @DateTimeFormat(pattern = "yyy-MM-dd HH:mm:ss")                                  Date publishDate) {    try {        // 将参数build成一个json对象        XContentBuilder content = XContentFactory.jsonBuilder()                .startObject()                .field("title", title)                .field("author", author)                .field("word_count", wordCount)                .field("publish_date", publishDate.getTime())                .endObject();
IndexResponse response = client.prepareIndex("book", "novel") .setSource(content) .get();
return new ResponseEntity(response.getId(), HttpStatus.OK); } catch (IOException e) { e.printStackTrace(); return new ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR); }}
重启SpringBoot工程,使用postman进行测试,测试结果如下:

Spring Boot 集成 ElasticSearch

使用返回的id去查询我们刚刚添加的书籍数据,结果如下:

Spring Boot 集成 ElasticSearch

删除接口开发



代码如下:
@DeleteMapping("/delete/book/novel")public ResponseEntity delete(@RequestParam("id") String id) {    DeleteResponse response = client.prepareDelete("book", "novel", id).get();
return new ResponseEntity(response.getResult(), HttpStatus.OK);}
重启SpringBoot工程,使用postman进行测试,删除数据成功:

Spring Boot 集成 ElasticSearch

更新接口开发
代码如下:
@PutMapping("/update/book/novel")public ResponseEntity update(@RequestParam("id") String id,                             @RequestParam(value = "title", required = false) String title,                             @RequestParam(value = "author", required = false) String author,                             @RequestParam(value = "word_count", required = false) Integer wordCount,                             @RequestParam(value = "publish_date", required = false)                             @DateTimeFormat(pattern = "yyy-MM-dd HH:mm:ss")                                     Date publishDate) {    UpdateRequest update = new UpdateRequest("book", "novel", id);    try {        XContentBuilder builder = XContentFactory.jsonBuilder()                .startObject();
if (title != null) { builder.field("title", title); } if (author != null) { builder.field("author", author); } if (wordCount != null) { builder.field("word_count", wordCount); } if (publishDate != null) { builder.field("publish_date", publishDate.getTime()); }
builder.endObject(); update.doc(builder);
UpdateResponse response = client.update(update).get();
return new ResponseEntity(response.getResult().toString(), HttpStatus.OK); } catch (Exception e) { e.printStackTrace(); return new ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR); }}
例如我们要修改文档id为AWQ-N_XeWWbfsfQzkrTh的书籍数据:

Spring Boot 集成 ElasticSearch

修改书籍的标题和作者:

Spring Boot 集成 ElasticSearch

修改成功:

Spring Boot 集成 ElasticSearch

复合查询接口开发
代码如下:
@PostMapping("/query/book/novel")public ResponseEntity query(@RequestParam(value = "title", required = false) String title,                            @RequestParam(value = "author", required = false) String author,                            @RequestParam(value = "word_count", required = false) Integer wordCount,                            @RequestParam(value = "publish_date", required = false)                            @DateTimeFormat(pattern = "yyy-MM-dd HH:mm:ss")                                    Date publishDate,                            @RequestParam(value = "gt_word_count", defaultValue = "0") Integer gtWordCount,                            @RequestParam(value = "lt_word_count", required = false) Integer ltWordCount) {
// 组装查询条件 BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); if (title != null) { boolQuery.must(QueryBuilders.matchQuery("title", title)); } if (author != null) { boolQuery.must(QueryBuilders.matchQuery("author", author)); } if (wordCount != null) { boolQuery.must(QueryBuilders.matchQuery("word_count", wordCount)); } if (publishDate != null) { boolQuery.must(QueryBuilders.matchQuery("publish_date", publishDate)); } // 以word_count作为条件范围 RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("word_count").from(gtWordCount); if (ltWordCount != null && ltWordCount > 0) { rangeQuery.to(ltWordCount); } boolQuery.filter(rangeQuery);
// 组装查询请求 SearchRequestBuilder requestBuilder = client.prepareSearch("book") .setTypes("novel") .setSearchType(SearchType.DFS_QUERY_THEN_FETCH) .setQuery(boolQuery) .setFrom(0) .setSize(10);
// 发送查询请求 SearchResponse response = requestBuilder.get();
// 组装查询到的数据集 List<Map<String, Object>> result = new ArrayList<>(); for (SearchHit searchHitFields : response.getHits()) { result.add(searchHitFields.getSource()); }
return new ResponseEntity(result, HttpStatus.OK);}
重启SpringBoot工程,使用postman进行测试,测试结果如下:

Spring Boot 集成 ElasticSearch

如果喜欢本篇文章,欢迎转发、点赞。关注订阅号「Web项目聚集地」,回复「进群」即可进入无广告技术交流。


推荐阅读

1. 基于 Spring Boot 的 Restful 风格实现增删改查

2. 如何使用牛逼的插件帮你规范代码
3. IntelliJ IDEA 构建maven多模块工程项目
4. 别在 Java 代码里乱打日志了,这才是正确姿势
5. 挑战 10 道超难  Java 面试题
6. 什么时候进行分库分表 ?
Spring Boot 集成 ElasticSearch
喜欢文章,点个
在看
 
Spring Boot 集成 ElasticSearch

本文分享自微信公众号 - Java后端(web_resource)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

版权声明:程序员胖胖胖虎阿 发表于 2022年9月1日 下午11:40。
转载请注明:Spring Boot 集成 ElasticSearch | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...