การเตรียมการกำหนดค่า
เพิ่มการพึ่งพาต่อไปนี้ในไฟล์ build.gradle:
คอมไพล์ "org.elasticsearch.client: การขนส่ง: 5.5.2" คอมไพล์ "org.elasticsearch: Elasticsearch: 5.5.2" // es 5.x การใช้งานภายในของ Apache log4 บันทึกการรวบรวม "org.apache.logging.log4j: log4j-core: 2.7
ที่นี่สปริงบูตใช้เวอร์ชัน 1.5.4 สปริงบูท 2 เวอร์ชันอย่างเป็นทางการได้รับการปล่อยตัวเมื่อไม่กี่วันที่ผ่านมา หนึ่งในคุณสมบัติใหม่ของ Spring Boot 2 คือการสนับสนุน Kotlin Spring Boot 2 ขึ้นอยู่กับ Spring 5 Spring 5 ยังรองรับ Koltin ดังนั้น Spring จึงเริ่มสนับสนุนการเขียนโปรแกรมที่ใช้งานได้
เกี่ยวกับความเข้ากันได้ของเวอร์ชัน
กำหนดค่าไคลเอนต์ที่เข้าถึง Elasticsearch และทั้งหมดใช้ es Javaapi ดั้งเดิมที่นี่
@ConfigurationPublic คลาส elasticsearchConfig {@bean (name = "client") Public TransportClient GetClient () {InetSocketTransportAddress Node = NULL; ลอง {node = ใหม่ inetSocketTransportaddress (inetaddress.getByName ("192.168.124.128"), 9300); } catch (unknownhostexception e) {e.printstacktrace (); } การตั้งค่าการตั้งค่า = settings.builder (). ใส่ ("cluster.name", "my-es"). build (); ไคลเอนต์ TransportClient = ใหม่ preBuiltTransportClient (การตั้งค่า); client.addtransportaddress (Node); ไคลเอนต์ส่งคืน; -พอร์ต SocketTransport สามารถดูได้โดยใช้ http: // ip: 9200/_nodes และค่าเริ่มต้นคือการใช้พอร์ต 9300
การดำเนินการ crud
สร้างคอนโทรลเลอร์ใหม่ ElasticsearchController โดยใช้ es Javaapi ดั้งเดิม
@RestControllerPublic คลาส ElasticsearchController {@autowired TransportClient Client;}การเพิ่มวิธีการสำหรับการเพิ่มการลบการค้นหาและการแก้ไขในคอนโทรลเลอร์
เพิ่มการดำเนินงาน
@PostMapping ("เพิ่ม/หนังสือ/นวนิยาย") การตอบโต้สาธารณะเพิ่ม (@requestparam (name = "title") ชื่อสตริง, @requestparam (name = "uthro") สตริงผู้แต่ง, @requestparam (name = "word_count") int wordCount, @requestparam hh: mm: ss ") วันที่เผยแพร่) {ลอง {xcontentbuilder เนื้อหา = xcontentfactory.jsonbuilder (). startobject () .field (" ชื่อ ", ชื่อ) .field (" ผู้เขียน ", ผู้เขียน) indexResponse result = this.client.prepareIndex ("หนังสือ", "นวนิยาย"). setSource (เนื้อหา) .get (); ส่งคืน ResponseEntity ใหม่ (result.getId (), httpstatus.ok); } catch (ioexception e) {e.printstacktrace (); ส่งคืน ResponseEntity ใหม่ (httpstatus.internal_server_error); -ลบการทำงาน
@DeleTeMapping ("/ลบ/หนังสือ/นวนิยาย") การตอบสนองสาธารณะลบ (@RequestParam (name = "id") id id) {deleteresponse result = client.prepareDelete ("หนังสือ", "นวนิยาย", id) .get (); ส่งคืน ResponseEntity ใหม่ (result.getResult (). toString (), httpstatus.ok); -การดำเนินการค้นหา
@getMapping ("/get/book/novel") การตอบสนองสาธารณะ get (@requestparam (name = "id", defaultValue = "") id id) {ถ้า (id.isempty ()) {ส่งคืน responseentity ใหม่ (httpstatus.not_found); } getResponse result = this.client.pareget ("หนังสือ", "นวนิยาย", id) .get (); if (! result.isexists ()) {ส่งคืน ResponseEntity ใหม่ (httpstatus.not_found); } ส่งคืน ResponseEntity ใหม่ (result.getSource (), httpstatus.ok); -อัปเดตการดำเนินการ
@putMapping ("/put/book/novel") การอัพเดทการตอบสนองสาธารณะ (@RequestParam (name = "id") id id, @requestparam (name = "title", จำเป็น = false) ชื่อสตริง, @requestparam (name = "uther" if (title! = null) {builder.field ("ชื่อ", ชื่อเรื่อง); } if (ผู้เขียน! = null) {builder.field ("ผู้แต่ง", ผู้แต่ง); } builder.endobject (); updateRequest updateRequest = ใหม่ updateRequest ("หนังสือ", "นวนิยาย", id); updaterequest.doc (ผู้สร้าง); updateresponse result = client.update (updateRequest) .get (); ส่งคืน ResponseEntity ใหม่ (result.getResult (). toString (), httpstatus.ok); } catch (exception e) {e.printstacktrace (); ส่งคืน ResponseEntity ใหม่ (httpstatus.internal_server_error); -การค้นหาแบบผสม
@getMapping ("/query/book/novel") Query ResponseEntity Public (@RequestParam (name = "Author", จำเป็น = false) Author Author, @requestParam (name = "title", string @requestparam (name = "gt_word_count", defaultValue = "0") เท็จ) จำนวนเต็ม ltwordCount) {boolQueryBuilder boolQueryBuilder = queryBuilders.boolQuery (); if (ผู้เขียน! = null) {boolQueryBuilder.must (queryBuilders.matchQuery ("ผู้แต่ง", ผู้เขียน)); } if (title! = null) {boolQueryBuilder.must (queryBuilders.matchQuery ("ชื่อ", ชื่อเรื่อง)); } rangeQueryBuilder rangeQueryBuilder = queryBuilders.RangeQuery ("word_count") จาก (gtwordCount); if (ltwordCount! = null && ltwordCount> 0) {rangeQueryBuilder.to (ltwordCount); } boolQueryBuilder.filter (rangeQueryBuilder); SearchRequestBuilder SearchRequestBuilder = this.client.preparesearch ("หนังสือ") .setTypes ("นวนิยาย") .SetSearchType (SearchType.dfs_query_then_fetch) .SetQuery System.out.println (SearchRequestBuilder); // debug searchResponse response = searchRequestBuilder.get (); รายการ <map <string, object >> result = new ArrayList <> (); สำหรับ (searchhit hit: response.getHits ()) {result.add (hit.getSource ()); } ส่งคืน ResponseEntity ใหม่ (ผลลัพธ์, httpstatus.ok); -รหัสข้างต้นจัดคิวรีแบบผสมคล้ายกับแบบสอบถาม DSL ต่อไปนี้:
{"Query": {"bool": {"ต้อง": [{"จับคู่": {"ผู้แต่ง": "จางซาน"}}, {"จับคู่": {"ชื่อ": "elasticsearch"}}], "filter": [ -สรุป
ข้างต้นคือสิ่งที่บรรณาธิการแนะนำให้ใช้กับ Springboot รวม Elasticsearch และดำเนินการ CRUD ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับทุกคนในเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!