Spring Boot集成ElasticSearch实现简单的增删查改接口
SpringBoot集成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的客户端实例对象。代码如下:
package org.zero01.elasticsearch.demo.config; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.InetSocketTransportAddress; import org.elasticsearch.transport.client.PreBuiltTransportClient; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.net.InetAddress; import java.net.UnknownHostException; /** * @program: es-demo * @description: es配置类 * @author: 01 * @create: 2018-06-28 22:32 **/ @Configuration public 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; } }
查询接口开发
我现在有一个结构化的索引如下:
该索引中有一些文档数据,如下:
在工程中新建一个controller包,在该包中新建一个 BookCrudController 类,用于演示es增删查改接口demo。我们首先来开发查询接口,代码如下:
package org.zero01.elasticsearch.demo.controller; import org.elasticsearch.action.get.GetResponse; import org.elasticsearch.client.transport.TransportClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; /** * @program: es-demo * @description: es增删查改接口demo * @author: 01 * @create: 2018-07-01 10:42 **/ @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进行测试,查询结果如下:
新增接口开发
在 BookCrudController 类中开发新增接口,代码如下:
/** * 添加书籍数据 * * @param title 书籍标题 * @param author 书籍作者 * @param wordCount 书籍字数 * @param publishDate 发行时间 * @return */ @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进行测试,测试结果如下:
使用返回的id去查询我们刚刚添加的书籍数据,结果如下:
删除接口开发
代码如下:
/** * 按id删除数据 * * @param id * @return */ @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进行测试,删除数据成功:
更新接口开发
代码如下:
/** * 根据文档id更新某个文档的数据 * * @param id * @param title * @param author * @param wordCount * @param publishDate * @return */ @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的书籍数据:
修改书籍的标题和作者:
修改成功:
复合查询接口开发
代码如下:
/** * 复合查询接口 * * @param title * @param author * @param wordCount * @param publishDate * @param gtWordCount * @param ltWordCount * @return */ @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进行测试,测试结果如下:
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
记一次安装多版本php的四个雷区,你踩着了吗
记一次安装多版本的php的四个雷区,你踩着了吗 需求:公司需要在同一台服务器上安装不同版本的php,而这一台的服务上已经安装了php.7.1,现需要同时存在两个版本,而另一个版本为php5.6、 原版本的php是使用一键安装工具oneinstack来装的 工具下载可参考官网:https://oneinstack.com/install/ (以下安装都是以oneinstack来安装) 一、安装另一个版本php5.6 注意以下是正确的安装,遇到的坑下面再说 1、 安装php5.6 因为以前的php也是使用oneinstack安装的所以启动文件是是php-fpm,我们需要修改php-fpm文件名,防止再次安装被覆盖。 停止本地的php7.1 #servicephp-fpmstop 更改php-fpm启动文件名 #mv/etc/init.d/php-fpm/etc/init.d/php-fpm.bk 2、修改oneinstack的options.conf文件。 使用oneinstack工具安装,每次都会读取options.conf这跟文件,然后再安装,所以需要修改该文件的php路径,...
- 下一篇
某系统单点登录性能测试诊断分析优化过程
某系统单点登录性能测试诊断分析优化过程 原因说明 下面描述的是前段时间协助本地一家上市IT公司做产品技术选型时对他们的技术框架进行性能测试与优化过程记录,因测试过程中涉及数据库选型和各类问题的监控分析优化,篇幅比较大,本次主要是描述在同样基础软硬件下、同样应用工程包和框架、同样数据量下,针对MYSQL环境下进行单点登录压力测试的结果过程记录。 初始环境配置 测试内容 1、 用户登录,首页查看,退出 2、 某业务交易新增、查询、删除、上传文件 3、 业务审批流程创建、提交、审批、同意等工作流程; 问题诊断分析 LR端监控分析 在压力测试中,首先压力测试,登录首页、退出,10个用户并发10分钟,通过loadrunner控制台发现登录响应时间120秒超时现象,失败率一直在递增,LR结果如下图: 应用资源使用监控分析 因为是使用wind2008系统服务,监控相对比较方面,通过任务管理器监控,发现应用服务器CPU使用不均衡,出现类似单线程死锁现象,其中一个CPU线程使用率大于80%,而另外一个CPU线程使用率非常低,如下图: 这时发现网络带宽使用率也非常高,10用户并发网络IO瓶颈每秒大...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS关闭SELinux安全模块
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS6,CentOS7官方镜像安装Oracle11G
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19
- CentOS6,7,8上安装Nginx,支持https2.0的开启