這篇文章主要為大家展示了“SpringBoot整合Elasticsearch并實(shí)現(xiàn)CRUD操作的示例分析”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“SpringBoot整合Elasticsearch并實(shí)現(xiàn)CRUD操作的示例分析”這篇文章吧。
專注于為中小企業(yè)提供網(wǎng)站建設(shè)、網(wǎng)站制作服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)雙峰免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了超過千家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
配置準(zhǔn)備
在build.gradle文件中添加如下依賴:
compile "org.elasticsearch.client:transport:5.5.2" compile "org.elasticsearch:elasticsearch:5.5.2" //es 5.x的內(nèi)部使用的 apache log4日志 compile "org.apache.logging.log4j:log4j-core:2.7" compile "org.apache.logging.log4j:log4j-api:2.7"
這里spring boot使用的是1.5.4版,前些天spring boot 2正式版已經(jīng)發(fā)布,spring boot 2新特性中有一條是支持kotlin,spring boot 2基于spring 5,spring 5也支持了koltin,所以spring也開始支持函數(shù)式編程。
關(guān)于版本兼容
配置訪問Elasticsearch的客戶端,這里都使用原生es JavaAPI。
@Configuration public class ElasticSearchConfig { @Bean(name = "client") public TransportClient getClient() { InetSocketTransportAddress node = null; try { node = new InetSocketTransportAddress(InetAddress.getByName("192.168.124.128"), 9300); } catch (UnknownHostException e) { e.printStackTrace(); } Settings settings = Settings.builder().put("cluster.name", "my-es").build(); TransportClient client = new PreBuiltTransportClient(settings); client.addTransportAddress(node); return client; } }
SocketTransport端口可以使用http://ip:9200/_nodes方式查看,這里默認(rèn)使用的是9300端口。
CRUD操作
新建一個(gè)控制器ElasticSearchController,使用原生的es JavaAPI。
@RestController public class ElasticSearchController { @Autowired TransportClient client; }
在控制器中添加增刪查改方法
增加操作
@PostMapping("add/book/novel") public ResponseEntity add( @RequestParam(name = "title") String title, @RequestParam(name = "authro") String author, @RequestParam(name = "word_count") int wordCount, @RequestParam(name = "publish_date") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")Date publishDate ) { try { XContentBuilder content = XContentFactory.jsonBuilder().startObject() .field("title", title) .field("author", author) .field("word_count", wordCount) .field("publish_date", publishDate.getTime()) .endObject(); IndexResponse result = this.client.prepareIndex("book", "novel").setSource(content).get(); return new ResponseEntity(result.getId(), HttpStatus.OK); } catch (IOException e) { e.printStackTrace(); return new ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR); } }
刪除操作
@DeleteMapping("/delete/book/novel") public ResponseEntity delete(@RequestParam(name = "id") String id) { DeleteResponse result = client.prepareDelete("book", "novel", id).get(); return new ResponseEntity(result.getResult().toString(), HttpStatus.OK); }
查找操作
@GetMapping("/get/book/novel") public ResponseEntity get(@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); }
更新操作
@PutMapping("/put/book/novel") public ResponseEntity update(@RequestParam(name = "id") String id, @RequestParam(name = "title", required = false) String title, @RequestParam(name = "author", required = false) String author ) { try { XContentBuilder builder = XContentFactory.jsonBuilder().startObject(); if (title!= null) { builder.field("title", title); } if (author != null) { builder.field("author", author); } builder.endObject(); UpdateRequest updateRequest = new UpdateRequest("book", "novel", id); updateRequest.doc(builder); UpdateResponse result = client.update(updateRequest).get(); return new ResponseEntity(result.getResult().toString(), HttpStatus.OK); } catch (Exception e) { e.printStackTrace(); return new ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR); } }
復(fù)合查找
@GetMapping("/query/book/novel") public ResponseEntity query(@RequestParam(name = "author", required = false) String author, @RequestParam(name = "title", required = false) String title, @RequestParam(name = "gt_word_count", defaultValue = "0") int gtWordCount, @RequestParam(name = "lt_word_count", required = false) Integer ltWordCount) { BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); if (author != null) { boolQueryBuilder.must(QueryBuilders.matchQuery("author",author)); } if (title != null) { boolQueryBuilder.must(QueryBuilders.matchQuery("title", title)); } RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("word_count").from(gtWordCount); if (ltWordCount != null && ltWordCount > 0) { rangeQueryBuilder.to(ltWordCount); } boolQueryBuilder.filter(rangeQueryBuilder); SearchRequestBuilder searchRequestBuilder = this.client.prepareSearch("book") .setTypes("novel") .setSearchType(SearchType.DFS_QUERY_THEN_FETCH) .setQuery(boolQueryBuilder) .setFrom(0) .setSize(10); System.out.println(searchRequestBuilder); //調(diào)試用 SearchResponse response = searchRequestBuilder.get(); List<Map<String, Object>> result = new ArrayList<>(); for (SearchHit hit : response.getHits()) { result.add(hit.getSource()); } return new ResponseEntity(result, HttpStatus.OK); }
上面的代碼組織的復(fù)合查詢類似下面的Query DSL:
{ "query":{ "bool":{ "must":[ {"match":{"author":"張三"}}, {"match":{"title":"Elasticsearch"}} ], "filter":[ {"range": {"word_count":{ "gt":"0", "lt":"3000" } } } ] } } }
以上是“SpringBoot整合Elasticsearch并實(shí)現(xiàn)CRUD操作的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
文章題目:SpringBoot整合Elasticsearch并實(shí)現(xiàn)CRUD操作的示例分析
分享URL:http://jinyejixie.com/article10/jojido.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司、App開發(fā)、云服務(wù)器、網(wǎng)頁設(shè)計(jì)公司、網(wǎng)站導(dǎo)航、域名注冊(cè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)