كما نعلم جميعًا ، يشار إلى Elasticsearch باسم ES ، والذي يعتمد على خادم بحث يعتمد على Lucene. يوفر محرك بحث كامل عن استخدام النص متعدد المستخدمين استنادًا إلى واجهة الويب المريحة. تم تطوير Elasticsearch في Java وتم إصداره كمصدر مفتوح بموجب شروط ترخيص Apache. إنه حاليًا محرك بحث شهير على مستوى المؤسسة. تم تصميمه في الحوسبة السحابية ، ويمكنه تحقيق البحث في الوقت الفعلي والاستقرار والموثوقية والسريعة وسهلة التثبيت والاستخدام.
نقوم بإنشاء موقع ويب أو تطبيق ونضيف وظائف البحث ، لكن من الصعب للغاية إنشاء مهمة بحث. نريد أن يتم تشغيل حل البحث بسرعة ، نريد أن يكون لدينا تكوين صفري ووضع بحث مجاني تمامًا ، نريد أن نكون قادرين على استخدام JSON ببساطة لفهرسة البيانات عبر HTTP ، نريد أن يكون خادم البحث الخاص بنا متاحًا دائمًا ، ونريد أن نكون قادرين على البدء من واحد وتوسيع نطاقه إلى المئات ، نريد البحث في الوقت الفعلي ، نريد أن نكون متعددة البهجة ، نريد بناء محلول سحابة. لذلك نحن نستخدم Elasticsearch لحل كل هذه المشكلات والمزيد من المشكلات الأخرى التي قد تنشأ.
عند استخدام ES في Java ، أريد فقط حل المشكلة التي مفادها أن سرعة الاستعلام ليست سريعة بما فيه الكفاية والكفاءة ليست عالية بما يكفي. لم يعد بإمكان الاستعلام الفردي للبيانات من قاعدة البيانات تلبية احتياجات العمل الحالية. نعم! الآن دعنا نتحدث عن كيفية استخدام خادم البحث السحري لـ ES في Java. بادئ ذي بدء ، يجب أن تشير إلى حزمة التبعية ES ، والتبعيات هي كما يلي:
<Rependency> <roupiD> org.elasticsearch.client </rougeid> <StifactId> النقل </artifactid> <الإصدار> 5.5.0 </version> </dependency> <roupiD> org.elasticsearch.client </groupid> <StifactId> النقل </attifactid> <sople> 5.5 <Rependency> <roupiD> org.elasticsearch </groupId> <StifactId> elasticsearch </artifactid> <الإصدار> 5.5.0 </version> </dependency>
حسنًا ، بعد إضافة التبعيات ، ندخل مرحلة استخدام ES. بالمناسبة ، هناك مشكلة يجب شرحها. لاستخدام ES ، تحتاج إلى تثبيت مجموعة أدوات JDK1.8 و tomcat يجب أن تكون الإصدار 7.05 أو أعلى ، وإلا فلن يتم دعم ES ، ويمكن الإبلاغ عن خطأ عند الاندماج في المشروع! ، هناك أيضًا تثبيت وتنزيل ES ، وهنا عنوان التنزيل: https://www.elastic.co/Downloads/elasticsearch
بعد أن يكون كل شيء جاهزًا ، سندخل اللحظة التي نتطلع إليها حقًا. ما ، نعم ، كيف أبحث عن الأشياء في خادم ES والاستعلام عنها في Java ، اسمحوا لي أن أكشفها واحدًا تلو الآخر لك:
أولاً ، نقترح فئة أدوات ES
package com.osa.utils ؛ import java.io.bufferedreader ؛ import java.io.ioException ؛ import java.io.inputstreamreader ؛ import java.io.printWriter ؛ import java.net.url ؛ import java.net.urlconnection ؛ import. java.util.list ؛ import java.util.map ؛ import java.util.set ؛ import org.apache.http.client.clientprotocolexception ؛ import com.alibaba.fastjson.jsonarray ؛ eystralspaBa.Affjson.jsonexception ؛ {/** * أرسل طلبًا إلى url المحدد * * url url * url لإرسال الطلب * param param * معلمات الطلب ، يجب أن تكون معلمات الطلب في نموذج name1 = value1 & name2 = value2. * return url response نتيجة للموارد عن بُعد الممثلة في المورد عن بُعد*/ سلسلة ثابتة عامة sendget (url url string ، string param) {string result = "" ؛ BufferedReader في = فارغة ؛ حاول {String urlnamestring = url + "؟"؟ + param ؛ url realurl = url جديد (urlnamestring) ؛ // افتح الاتصال بين اتصال urlconnection url = realurl.openconnection () ؛ // قم بتعيين Connection.SetRequestProperty ("قبول" ، "*/*") ؛ connection.setRequestProperty ("connection" ، "keep-alive") ؛ connection.setRequestProperty ("Assion-Agent" ، "Mozilla/4.0 (متوافق ؛ MSIE 6.0 ؛ Windows NT 5.1 ؛ SV1)") ؛ // إنشاء اتصال فعلي connection.connect () ؛ // احصل على جميع حقول رأس الاستجابة <string ، قائمة <Tring>> map = connection.getheaderfields () ؛ . }. خط السلسلة بينما ((line = in.readline ())! = null) {result += line ؛ }} catch (استثناء e) {system.out.println ("حدث استثناء عند إرسال طلب الحصول على!" + e) ؛ E.PrintStackTrace () ؛ } // استخدم أخيرًا كتلة لإغلاق دفق الإدخال أخيرًا {try {if (in! = null) {in.close () ؛ }} catch (استثناء e2) {e2.printStackTrace () ؛ }} نتيجة الإرجاع ؛ } /** * أرسل طلبًا إلى url المحدد * url url * url لإرسال طلب * param param * المعلمة ، يجب أن تكون معلمة الطلب في نموذج name1 = value1 & name2 = value2. * return استجابة نتيجة المورد عن بُعد يمثله */ public static String SendPost (url url ، String param) {printWriter Out = null ؛ BufferedReader في = فارغة ؛ نتيجة السلسلة = "" ؛ حاول {url realurl = url new (url) ؛ // افتح الاتصال بين urlconnection conn = alwurl.openconnection () ؛ // قم بتعيين سمة الطلب العام conn.setRequestProperty ("قبول" ، "*/*") ؛ Conn.SetRequestProperty ("connection" ، "keep-alive") ؛ Conn.SetRequestProperty ("Asser-Agent" ، "Mozilla/4.0 (متوافق ؛ MSIE 6.0 ؛ Windows NT 5.1 ؛ SV1)") ؛ // لإرسال طلب منشور ، يجب عليك تعيين السطرين التاليين على conn.setDooutput (True) ؛ conn.setDoInput (صواب) ؛ // احصل على دفق الإخراج المقابل لكائن urlConnection Out = new printWriter (conn.getOutputStream ()) ؛ // إرسال المعلمة request Out.print (param) ؛ // buffer out.flush () من دفق الإخراج Flush ؛ . خط السلسلة بينما ((line = in.readline ())! = null) {result += line ؛ }} catch (استثناء e) {system.out.println ("حدث استثناء عند إرسال طلب البريد!" +e) ؛ E.PrintStackTrace () ؛ } // استخدم الكتل أخيرًا لإغلاق دفق الإخراج ودفق الإدخال أخيرًا {try {if (out! = null) {out.close () ؛ } if (in! = null) {in.close () ؛ }} catch (ioException ex) {ex.printStackTrace () ؛ }} نتيجة الإرجاع ؛ }} بعد توفر فئة الأدوات ، يمكنك أن ترى أن هناك طريقتين لإرسال الطلبات ، إحداها هي طرق Sendget و SendPost. يمكن اختيار الطريقتين بناءً على اختياراتهما. بالطبع ، هذه مجرد طريقة لإرسال الطلبات. كيف تسميهم؟ هنا ، نظرًا لأننا نستفسر من ES ، فليس هناك حاجة لاستخدام أطر MyBatis أو السبات. يمكنك تحديد SQL بنفسك في طبقة البيانات ، ثم استخدام SQL للاتصال بطريقة Sendget/SendPost من خلال فئة الأدوات السابقة ، على النحو التالي:
String sql = urlencoder.encode ("حدد * من الجدول")
سلسلة السلسلة = 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 (result) ؛ // قم بإخراج tag tag net.sf.json.jsonoBject HitsJsonObject = jsonobject.getJsonObject ("Hits") ؛ بعد الحصول على البيانات ، يستنتج أنها عمليات تجارية. لقد انتهى الأمر هنا تقريبًا.
ما سبق هو بعض عمليات الاستعلام ، فماذا يجب أن نفعل إذا احتجنا إلى دفع بيانات إدراج في ES؟ إعطاء مثال
package 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 اكتب*@param idname معرف المعرف الاسم*@param json يمكن لـ json المخزنة قبول الخريطة*@return*/publicStaticMapsave (فهرس السلسلة ، نوع السلسلة ، السلسلة idname ، jsonobject json)
تتم معالجة المعلمات التي تم تمريرها وتسمى طريقة الحفظ لأداء عملية الإدراج
بر = estools.client.prepareBulk (). setRefresh (true) ؛ map resultmap = newhashMap () ؛ for (كائن الكائن: listData) {jsonobject json = jsonobject.fromobject (كائن) ؛ // لا يوجد اسم idnize ، ثم يتيح Elasticesearch توليد تلقائي. if (stringUtils.isblank (idName)) {indexRequestBuilder lrb = elasticsearchutils.client .prepareIndex (index ، type) .SetSource (json) ؛ bulkrequest.add (lrb) ؛ json.OptString (idName) ؛ indexRequestBuilder lrb = estools.client.prepareindex (الفهرس ، النوع ، idvalue) .SetSource (JSON) ؛ BulkRequest.Add (LRB) ؛}} bulkresponse bulkresponse = bulkrequest.execute (). Actionget () ؛ if (bulkresponse.hasfailures ()) {// فشل العملية عن طريق التكرار من خلال كل عنصر استجابة بالجملة. resultmap ؛} bulkRequest = estools.client.prepareBulk () ؛ resultmap.put ("200" ، "Save ES Success!") فئة أداة Elasticsearchutils
الفئة العامة elasticsearchutils {private static final string cluster_name = "cluster.name" ؛ private static final string es_ip = "es.ip" settings.builder (). put (cluster_name ، configuTils.getConfig (cluster_name)). build () ؛ if (client! = null) {client = newBuiltTransportClient (Settings) .addTransportAddress (new inetsocketTransportDress (inetaddress.getbyname integer.parseint (configutils.getConfig (es_port)))) ؛} عميل الإرجاع ؛} ما سبق هو عملية الإدراج. حسنًا ، هذا كل شيء لملخص اليوم. آمل أن يجلب لك بعض المساعدة الصغيرة ، وآمل أن تتمكن من دعم wulin.com أكثر.