本文共 8756 字,大约阅读时间需要 29 分钟。
1、项目配置
2、新建配置类4.0.0 cn.edu.shu ces_chenjie 0.0.1-SNAPSHOT jar ces_chenjie Demo project for Spring Boot org.springframework.boot spring-boot-starter-parent 1.5.7.RELEASE UTF-8 UTF-8 1.8 5.6.3 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-test test org.elasticsearch.client transport 5.6.3 org.apache.logging.log4j log4j-core 2.7 org.springframework.boot spring-boot-maven-plugin
package cn.edu.shu.ces_chenjie;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;@Configurationpublic class MyConf { @Bean public TransportClient client() throws UnknownHostException { InetSocketTransportAddress node1 = new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300 ); //连接localhost的9300端口,即Elasticsearch的master Settings settings = Settings.builder(). put("cluster.name","chenjie")//定义集群的名字,应该与Elasticsearch的master的配置保持一致 .build(); TransportClient client = new PreBuiltTransportClient(settings);//使用设置建立客户端 client.addTransportAddress(node1); return client; }}
3、新建Controller
package cn.edu.shu.ces_chenjie;import org.elasticsearch.action.delete.DeleteResponse;import org.elasticsearch.action.get.GetResponse;import org.elasticsearch.action.index.IndexResponse;import org.elasticsearch.action.search.SearchRequestBuilder;import org.elasticsearch.action.search.SearchResponse;import org.elasticsearch.action.search.SearchType;import org.elasticsearch.action.update.UpdateRequest;import org.elasticsearch.action.update.UpdateResponse;import org.elasticsearch.client.transport.TransportClient;import org.elasticsearch.common.xcontent.XContentBuilder;import org.elasticsearch.common.xcontent.XContentFactory;import org.elasticsearch.index.query.BoolQueryBuilder;import org.elasticsearch.index.query.QueryBuilders;import org.elasticsearch.index.query.RangeQueryBuilder;import org.elasticsearch.search.SearchHit;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.format.annotation.DateTimeFormat;import org.springframework.http.HttpStatus;import org.springframework.http.ResponseEntity;import org.springframework.web.bind.annotation.*;import java.io.IOException;import java.util.ArrayList;import java.util.Date;import java.util.List;import java.util.Map;@SpringBootApplication@RestControllerpublic class CesChenjieApplication { @Autowired private TransportClient client;//elasticsearch客户端 @RequestMapping("/") public String index(){ return "index"; } /*** * GET localhost:8080/book/novel?id=1 * @param id 书籍ID * @return 书籍信息 */ @GetMapping("/book/novel") @ResponseBody public ResponseEntity getBookNovel(@RequestParam(name="id",defaultValue = "")String id){ if(id.isEmpty()){ return new ResponseEntity(HttpStatus.NOT_FOUND); } GetResponse result = this.client.prepareGet("book","novel",id).get(); if( !result.isExists()) { return new ResponseEntity(HttpStatus.NOT_FOUND); } return new ResponseEntity(result.getSource(), HttpStatus.OK); } /** * 插入一条数据 * POST localhost:8080/book/novel * @param title 标题 * @param author 作者 * @param word_count 字数 * @param publish_date 出版日期 * @return 成功返回ID,失败返回错误码 */ @PostMapping("/book/novel") public ResponseEntity addBookNovel( @RequestParam(name="title",defaultValue = "")String title, @RequestParam(name="author",defaultValue = "")String author, @RequestParam(name="word_count",defaultValue = "")Integer word_count, @RequestParam(name="publish_date",defaultValue = "") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date publish_date){ try { XContentBuilder content = XContentFactory.jsonBuilder() .startObject() .field("title",title) .field("author",author) .field("word_count",word_count) .field("publish_date",publish_date.getTime()) .endObject(); IndexResponse response = this.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); } } /*** * 通过DELETE 删除 * @param id 书籍 * @return */ @DeleteMapping("/book/novel") public ResponseEntity delBookNovel(@RequestParam(name="id",defaultValue = "")String id){ if(id.isEmpty()){ return new ResponseEntity(HttpStatus.NOT_FOUND); } DeleteResponse response = client.prepareDelete("book","novel",id).get(); return new ResponseEntity(response.getResult().toString(), HttpStatus.OK); } /*** * 通过PUT修改 * @param id 书籍 * @param title * @param author * @param word_count * @param publish_date * @return */ @PutMapping("/book/novel") public ResponseEntity updateBookNovel( @RequestParam(name="id",defaultValue = "")String id, @RequestParam(name="title",required = false)String title, @RequestParam(name="author",required = false)String author, @RequestParam(name="word_count",required = false)Integer word_count, @RequestParam(name="publish_date",required = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date publish_date){ if(id.isEmpty()){ return new ResponseEntity(HttpStatus.NOT_FOUND); } UpdateRequest update = new UpdateRequest("book","novel",id); try { XContentBuilder content = XContentFactory.jsonBuilder() .startObject(); if(title != null) content.field("title",title); if(author != null) content.field("author",author); if(word_count != null) content.field("word_count",word_count); if(publish_date != null) content.field("publish_date",publish_date.getTime()); content.endObject(); update.doc(content); } catch (IOException e) { e.printStackTrace(); return new ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR); } try { UpdateResponse response = this.client.update(update).get(); return new ResponseEntity(response.getResult().toString(),HttpStatus.OK); } catch (Exception e) { e.printStackTrace(); return new ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR); } } /*** * 通过POST进行复合查询 * @param title * @param author * @param gtWordCount * @param ltWordCount * @return */ @PostMapping("book/novel/query") public ResponseEntity query( @RequestParam(name="title",required = false)String title, @RequestParam(name="author",required = false)String author, @RequestParam(name="gt_word_count",defaultValue = "0")Integer gtWordCount, @RequestParam(name="lt_word_count",defaultValue = "0",required = false)Integer ltWordCount ){ BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); if(author != null){ boolQuery.must(QueryBuilders.matchQuery("author",author)); } if(title != null){ boolQuery.must(QueryBuilders.matchQuery("title",title)); } RangeQueryBuilder range = QueryBuilders.rangeQuery("word_count"); if(ltWordCount != null && ltWordCount >0){ range.to(ltWordCount); } boolQuery.filter(range); SearchRequestBuilder builder = this.client.prepareSearch("book") .setTypes("novel") .setSearchType(SearchType.DFS_QUERY_THEN_FETCH) .setQuery(boolQuery) .setFrom(0) .setSize(10); System.out.println(builder); SearchResponse response = builder.get(); List
4、使用POSTMAN测试