0
点赞
收藏
分享

微信扫一扫

Spring Boot 集成 ElasticSearch

书坊尚 2021-09-30 阅读 72
日记本

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

举报

相关推荐

0 条评论