pom.xml文件中,依賴的各jar包版本以下:java
<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的客戶端實例對象。代碼以下:node
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; } }
我如今有一個結構化的索引以下:web
該索引中有一些文檔數據,以下:spring
在工程中新建一個controller包,在該包中新建一個 BookCrudController 類,用於演示es增刪查改接口demo。咱們首先來開發查詢接口,代碼以下:json
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進行測試,查詢結果以下:app
在 BookCrudController 類中開發新增接口,代碼以下:elasticsearch
/** * 添加書籍數據 * * @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進行測試,測試結果以下:tcp
使用返回的id去查詢咱們剛剛添加的書籍數據,結果以下:ide
代碼以下:spring-boot
/** * 按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進行測試,測試結果以下: