1 Spring Boot集成ElasticSearch
pom.xml文件中,依赖的各jar包版本如下:
org.springframework.bootspring-boot-starter-parent2.0.3.RELEASE<!-- lookup parent from repository -->UTF-8UTF-81.85.5.2org.springframework.bootspring-boot-starter-weborg.projectlomboklomboktrueorg.springframework.bootspring-boot-starter-testtestorg.elasticsearch.clienttransport${elasticsearch.version}
在工程中新建一个config包,在该包中创建一个ESConfig配置类,用于构造es的客户端实例对象。代码如下:
@ConfigurationpublicclassESConfig{@BeanpublicTransportClientclient()throwsUnknownHostException{// 9300是es的tcp服务端口InetSocketTransportAddress node =newInetSocketTransportAddress(InetAddress.getByName("192.168.190.129"),9300);// 设置es节点的配置信息 Settings settings = Settings.builder().put("cluster.name","es") .build();// 实例化es的客户端对象TransportClient client =newPreBuiltTransportClient(settings); client.addTransportAddress(node);returnclient; }}
2 查询接口开发
我现在有一个结构化的索引如下:
该索引中有一些文档数据,如下:
在工程中新建一个controller包,在该包中新建一个 BookCrudController 类,用于演示es增删查改接口demo。我们首先来开发查询接口,代码如下:
@RestController@RequestMapping("/es/demo")publicclassBookCrudController{@AutowiredprivateTransportClient client;/** * 按id查询*@paramid*@return */@GetMapping("/get/book/novel")publicResponseEntity searchById(@RequestParam("id")String id) {if(id.isEmpty()) {returnnew ResponseEntity(HttpStatus.NOT_FOUND); }// 通过索引、类型、id向es进行查询数据GetResponse response = client.prepareGet("book","novel", id).get();if(!response.isExists()) {returnnew ResponseEntity(HttpStatus.NOT_FOUND); }// 返回查询到的数据returnnew ResponseEntity(response.getSource(), HttpStatus.OK); }}
启动SpringBoot工程,使用postman进行测试,查询结果如下:
3 新增接口开发
在 BookCrudController 类中开发新增接口,代码如下:
@PostMapping("/add/book/novel")publicResponseEntity 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();returnnew ResponseEntity(response.getId(), HttpStatus.OK);}catch(IOException e) { e.printStackTrace();returnnew ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR); }}
重启SpringBoot工程,使用postman进行测试,测试结果如下:
使用返回的id去查询我们刚刚添加的书籍数据,结果如下:
4 删除接口开发
代码如下:
@DeleteMapping("/delete/book/novel")publicResponseEntity delete(@RequestParam("id")String id) {DeleteResponse response = client.prepareDelete("book","novel", id).get();returnnew ResponseEntity(response.getResult(), HttpStatus.OK);}
重启SpringBoot工程,使用postman进行测试,删除数据成功:
5 更新接口开发
代码如下:
@PutMapping("/update/book/novel")publicResponseEntity update(@RequestParam("id")Stringid,@RequestParam(value ="title", required =false)Stringtitle,@RequestParam(value ="author", required =false)Stringauthor,@RequestParam(value ="word_count", required =false) Integer wordCount,@RequestParam(value ="publish_date", required =false)@DateTimeFormat(pattern ="yyy-MM-dd HH:mm:ss")DatepublishDate) {UpdateRequest update =newUpdateRequest("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();returnnewResponseEntity(response.getResult().toString(), HttpStatus.OK);}catch(Exception e) { e.printStackTrace();returnnewResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR); }}
例如我们要修改文档id为AWQ-N_XeWWbfsfQzkrTh的书籍数据:
修改书籍的标题和作者:
修改成功:
6 复合查询接口开发
代码如下:
@PostMapping("/query/book/novel")publicResponseEntity query(@RequestParam(value ="title", required =false)Stringtitle,@RequestParam(value ="author", required =false)Stringauthor,@RequestParam(value ="word_count", required =false) Integer wordCount,@RequestParam(value ="publish_date", required =false)@DateTimeFormat(pattern ="yyy-MM-dd HH:mm:ss")DatepublishDate,@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> result =newArrayList<>();for(SearchHit searchHitFields : response.getHits()) { result.add(searchHitFields.getSource()); }returnnewResponseEntity(result, HttpStatus.OK);}
重启SpringBoot工程,使用postman进行测试,测试结果如下:
参考原文:https://mp.weixin.qq.com/s/3DanaPw3OI9i_a1EffA19A