อย่างที่เราทราบกันดีว่า Elasticsearch เรียกว่า ES ซึ่งขึ้นอยู่กับเซิร์ฟเวอร์การค้นหาตาม Lucene มันมีเครื่องมือค้นหาข้อความแบบเต็มจำนวนผู้ใช้แบบกระจายแบบกระจายตามเว็บอินเตอร์เฟส RESTFUL Elasticsearch ได้รับการพัฒนาใน Java และเปิดตัวเป็นโอเพ่นซอร์สภายใต้ข้อกำหนดของใบอนุญาต Apache ปัจจุบันเป็นเครื่องมือค้นหาระดับองค์กรที่ได้รับความนิยม ออกแบบในคลาวด์คอมพิวติ้งสามารถบรรลุการค้นหาแบบเรียลไทม์เสถียรภาพความน่าเชื่อถือความรวดเร็วและง่ายต่อการติดตั้งและใช้งาน
เราสร้างเว็บไซต์หรือแอปพลิเคชันและเพิ่มฟังก์ชั่นการค้นหา แต่มันยากมากที่จะสร้างงานค้นหา เราต้องการให้โซลูชันการค้นหาทำงานเร็วเราต้องการให้มีการกำหนดค่าเป็นศูนย์และโหมดการค้นหาฟรีอย่างสมบูรณ์เราต้องการที่จะใช้ JSON เพื่อจัดทำดัชนีข้อมูลผ่าน HTTP เราต้องการให้เซิร์ฟเวอร์การค้นหาของเราพร้อมใช้งานเสมอเราต้องการเริ่มต้นจากหลายร้อยเราต้องการค้นหาแบบเรียลไทม์ ดังนั้นเราจึงใช้ Elasticsearch เพื่อแก้ปัญหาเหล่านี้และปัญหาอื่น ๆ ที่อาจเกิดขึ้น
เมื่อใช้ ES ใน Java ฉันแค่ต้องการแก้ปัญหาที่ความเร็วในการสืบค้นไม่เร็วพอและประสิทธิภาพไม่สูงพอ การสืบค้นข้อมูลเดียวจากฐานข้อมูลไม่สามารถตอบสนองความต้องการทางธุรกิจปัจจุบันได้อีกต่อไป ตกลง! ตอนนี้มาพูดคุยเกี่ยวกับวิธีการใช้ Magical Search Server ของ ES ใน Java ก่อนอื่นคุณต้องอ้างอิงแพ็คเกจการพึ่งพา ES และการพึ่งพามีดังนี้:
<การพึ่งพา> <roupId> org.elasticsearch.client </groupId> <ratifactid> การขนส่ง </artifactId> <cersion> 5.5.0 </เวอร์ชัน> </การพึ่งพาอาศัย> <roupId> org.elasticsearch.client </groupid> <ratifactid> <Ederency> <sderctId> org.elasticsearch </groupId> <ratifactid> ElasticSearch </artifactId> <version> 5.5.0 </Servive>
ตกลงหลังจากเพิ่มการพึ่งพาเราเข้าสู่ขั้นตอนการใช้งาน ES โดยวิธีการที่มีปัญหาที่ต้องอธิบาย ในการใช้ ES คุณต้องติดตั้งชุดเครื่องมือ JDK1.8 และ Tomcat ควรเป็นเวอร์ชัน 7.05 หรือสูงกว่ามิฉะนั้น ES จะไม่ได้รับการสนับสนุนและอาจมีการรายงานข้อผิดพลาดเมื่อรวมเข้ากับโครงการ! นอกจากนี้ยังมีการติดตั้งและดาวน์โหลด ES นี่คือที่อยู่ดาวน์โหลด: https://www.elastic.co/downloads/elasticsearch
หลังจากทุกอย่างพร้อมเราจะเข้าสู่ช่วงเวลาที่เราหวังว่าจะได้ อะไรใช่วิธีการค้นหาและสอบถามสิ่งต่าง ๆ ในเซิร์ฟเวอร์ ES ใน Java ให้ฉันเปิดเผยทีละคนสำหรับคุณ:
ก่อนอื่นเราขอแนะนำคลาสเครื่องมือ ES
แพ็คเกจ com.osa.utils; นำเข้า java.io.bufferedreader; นำเข้า java.io.ioexception; นำเข้า java.io.inputstreamreader; นำเข้า java.io.printwriter; นำเข้า java.net.url; นำเข้า Java.net.urlconnection; java.util.list; นำเข้า java.util.map; นำเข้า java.util.set; นำเข้า org.apache.http.client.clientprotocolexception; นำเข้า com.alibaba.fastjson.jsonarray; {/** * ส่งคำขอไปยัง URL ที่ระบุ * * @param url * url เพื่อส่งคำขอ * @param พารามิเตอร์ * พารามิเตอร์คำขอพารามิเตอร์การร้องขอควรอยู่ในรูปแบบของ NAME1 = Value1 & NAME2 = value2 * @return URL การตอบสนองผลลัพธ์ของทรัพยากรระยะไกลที่แสดงโดยทรัพยากรระยะไกล*/ สตริงคงที่สาธารณะ sendget (สตริง url, พารามิเตอร์สตริง) {string result = ""; bufferedReader ใน = null; ลอง {string urlnamestring = url + "?" + param; url realurl = url ใหม่ (urlnamestring); // เปิดการเชื่อมต่อระหว่างการเชื่อมต่อ urlconnection url = realurl.openconnection (); // ตั้งค่าแอตทริบิวต์การร้องขอทั่วไปการเชื่อมต่อ SetRequestProperty ("ยอมรับ", "*/*"); Connection.setRequestProperty ("การเชื่อมต่อ", "Keep-Alive"); Connection.setRequestProperty ("ผู้ใช้ตัวแทน", "Mozilla/4.0 (เข้ากันได้; MSIE 6.0; Windows NT 5.1; SV1)"); // สร้างการเชื่อมต่อการเชื่อมต่อจริง connect (); // รับฟิลด์ส่วนหัวตอบกลับทั้งหมด <String, list <String>> map = connection.getheaderfields (); // traverse ฟิลด์ส่วนหัวการตอบสนองทั้งหมดสำหรับ (คีย์สตริง: map.keyset ()) {system.out.println (คีย์ + "--->" + map.get (คีย์)); } // กำหนดสตรีมอินพุต bufferedReader เพื่ออ่านการตอบสนองของ URL ใน = bufferedReader ใหม่ (ใหม่ inputStreamReader (Connection.getInputStream ())); สายสตริง; ในขณะที่ ((line = in.readline ())! = null) {result += line; }} catch (exception e) {system.out.println ("ข้อยกเว้นเกิดขึ้นเมื่อส่งคำขอรับ!" + e); E.PrintStackTrace (); } // ใช้ในที่สุดบล็อกเพื่อปิดสตรีมอินพุตในที่สุด {ลอง {ถ้า (ใน! = null) {in.close (); }} catch (Exception e2) {e2.printstackTrace (); }} ผลการส่งคืน; } /** * ส่งคำขอไปยัง URL ที่ระบุ * @param url * url เพื่อส่งคำขอ * @param พารามิเตอร์ * พารามิเตอร์คำขอพารามิเตอร์คำขอควรอยู่ในรูปแบบของชื่อ 1 = value1 & name2 = value2 * @return ผลการตอบกลับของทรัพยากรระยะไกลที่แสดงโดย */ สตริงคงที่สาธารณะ sendPost (url สตริง, พารามิเตอร์สตริง) {printWriter out = null; bufferedReader ใน = null; สตริงผลลัพธ์ = ""; ลอง {url realurl = url ใหม่ (url); // เปิดการเชื่อมต่อระหว่าง urlConnection conn = realurl.openconnection (); // ตั้งค่าแอตทริบิวต์คำขอทั่วไป conn.setRequestProperty ("ยอมรับ", "*/*"); conn.setRequestProperty ("การเชื่อมต่อ", "Keep-Alive"); conn.setRequestProperty ("ผู้ใช้ตัวแทน", "Mozilla/4.0 (เข้ากันได้; MSIE 6.0; Windows NT 5.1; SV1)"); // ในการส่งคำขอโพสต์คุณต้องตั้งค่าสองบรรทัดต่อไปนี้เป็น conn.SetDoOutput (จริง); conn.setDoInput (จริง); // รับกระแสเอาต์พุตที่สอดคล้องกับวัตถุ urlConnection out = printwriter ใหม่ (conn.getOutputStream ()); // ส่งพารามิเตอร์การร้องขอ out.print (param); // บัฟเฟอร์ out.flush () ของสตรีมเอาต์พุตฟลัช; // กำหนดสตรีมอินพุต bufferedReader เพื่ออ่านการตอบสนองของ URL ใน = ใหม่ bufferedReader (ใหม่ inputStreamReader (conn.getInputStream ())); สายสตริง; ในขณะที่ ((line = in.readline ())! = null) {result += line; }} catch (exception e) {system.out.println ("ข้อยกเว้นเกิดขึ้นเมื่อส่งคำขอโพสต์!" +e); E.PrintStackTrace (); } // ใช้ในที่สุดบล็อกเพื่อปิดสตรีมเอาต์พุตและสตรีมอินพุตในที่สุด {ลอง {ถ้า (ออก! = null) {out.close (); } if (in! = null) {in.close (); }} catch (ioexception ex) {ex.printstacktrace (); }} ผลการส่งคืน; - หลังจากคลาสเครื่องมือพร้อมใช้งานคุณจะเห็นว่ามีสองวิธีในการส่งคำขอหนึ่งคือวิธีการส่งและ sendpost ทั้งสองวิธีสามารถเลือกได้ตามตัวเลือกของตนเอง แน่นอนว่านี่เป็นเพียงวิธีการส่งคำขอ จะเรียกพวกเขาอย่างไร? ที่นี่เนื่องจากเรากำลังสอบถามจาก ES จึงไม่จำเป็นต้องใช้ mybatis หรือ hibernate frameworks คุณสามารถกำหนด SQL ด้วยตัวเองในเลเยอร์ข้อมูลจากนั้นใช้ SQL เพื่อเรียกใช้เมธอด sendget/sendpost ผ่านคลาสเครื่องมือก่อนหน้าดังนี้:
string sql = urlencoder.encode ("เลือก * จากตาราง"); การเข้ารหัสเมธอดส่วนใหญ่จะลบช่องว่างบางส่วนใน SQL
สตริงผลลัพธ์ = httpsentutils.sendget ("http://221.124.71.8:9200/_sql", "sql ="+sql); สามารถกำหนดค่าพอร์ต IP Plus ได้เมื่อติดตั้ง
ตกลง! โดยทั่วไปหากการส่งสำเร็จในเวลานี้ข้อมูลใน ES สามารถเรียกคืนได้ เนื่องจากข้อมูล JSON ที่ส่งคืนใน ES เราจึงจัดรูปแบบสตริง JSON
net.sf.json.jsonobject jsonObject = net.sf.json.jsonobject.fromobject (ผลลัพธ์); // นำ HITS TAG NET.SF.JSON.JSONOBJECT HITSJSONOBJECT = JSONOBJECT.GETJSONOBJECT ("HITS"); หลังจากได้รับข้อมูลแล้วก็สรุปได้ว่าเป็นการดำเนินธุรกิจ เกือบจะอยู่ที่นี่แล้ว
ข้างต้นคือการดำเนินการแบบสอบถามดังนั้นเราควรทำอย่างไรถ้าเราต้องการใส่ข้อมูลใส่ลงใน ES? ยกตัวอย่าง
แพ็คเกจ com.sojson.core.elasticsearch.Manager; นำเข้า java.util.arraylist; นำเข้า java.util.hashmap; นำเข้า java.util.list; นำเข้า java.util.map; นำเข้า net.sf.json.jsonobject; org.elasticsearch.action.bulk.bulkresponse; นำเข้า org.elasticsearch.action.index.indexrequestbuilder; นำเข้า com.sojson.common.utils.stringutils; นำเข้า com.sojson.core.elasticsearch.utils.estools; พิมพ์*@param idname id ชื่อฟิลด์ชื่อ*@param json json ที่เก็บไว้สามารถยอมรับแผนที่*@return*/publicstaticmapsave (ดัชนีสตริง, ประเภทสตริง, idname สตริง, jsonobject json) {list list = newarraylist (); list.add (json); พารามิเตอร์ที่ส่งผ่านจะถูกประมวลผลและเรียกว่าวิธีการบันทึกเพื่อดำเนินการแทรก
/*** เพิ่มข้อมูลไปยัง elasticsearch*@ดัชนีดัชนี param*@ประเภทพารามิเตอร์ประเภท*@param iDname ชื่อฟิลด์ชื่อฟิลด์*@param listdata คอลเลกชันของวัตถุ*@return*/@suppresswarnings ("unchecked") publicstaticmapsave (ดัชนีสตริง = estools.client.preparebulk (). setrefresh (จริง); แผนที่ผลลัพธ์ = newhashmap (); สำหรับ (วัตถุวัตถุ: listdata) {jsonobject json = jsonobject.fromobject (วัตถุ); // ไม่มีชื่อ if (stringutils.isblank (idname)) {indexrequestbuilder lrb = elasticsearchutils.client .pareindex (ดัชนี, ประเภท) .SetSource (JSON); bulkrequest.add (lrb); // elasticsearchutils json.optstring (idname); indexrequestbuilder lrb = estools.client.prepareindex (ดัชนี, ประเภท, idvalue) .SetSource (JSON); bulkrequest.add (lrb);}} bulkresponse bulkresponse = bulkrequest.execute (). actionget (); ถ้า (bulkresponse.hasfailures ()) {// ความล้มเหลวของกระบวนการโดยการวนซ้ำผ่านแต่ละรายการตอบสนองต่อจำนวนมาก resultmap;} bulkrequest = estools.client.preparebulk (); resultmap.put ("200", "บันทึก es ประสบความสำเร็จ!"); return resultmap;}}} คลาสเครื่องมือ elasticsearchutils
คลาสสาธารณะ elasticsearchutils {สตริงสุดท้ายคงที่ cluster_name = "cluster.name"; สตริงสุดท้ายคงที่ส่วนตัว es_ip = "es.ip"; สตริงสุดท้ายคงที่ส่วนตัว es_port = "es.port"; การตั้งค่าคงที่ส่วนตัว; Settings.builder (). ใส่ (cluster_name, configutils.getConfig (cluster_name)). build (); ถ้า (ไคลเอนต์! = null) {client = new PreBuiltTransportClient (การตั้งค่า) Integer.ParseInt (configutils.getConfig (es_port)))));} return client;} ข้างต้นคือการดำเนินการแทรก ES โอเคนั่นคือทั้งหมดสำหรับบทสรุปของวันนี้ ฉันหวังว่ามันจะช่วยให้คุณได้รับความช่วยเหลือเล็กน้อยและฉันหวังว่าคุณจะสนับสนุน Wulin.com ได้มากขึ้น