منذ فترة ، كنت أخطط لبناء خدمة بحث بسيطة للمشروع. على الرغم من أن قاعدة بيانات الأعمال MONGODB توفر دعمًا للبحث عن النص ، فحين حاجة إلى وضع عدد كبير من المستندات من خلال الكلمات الرئيسية ، من الواضح أن ES أكثر ملاءمة كمحرك بحث (على الرغم من أن معظمنا قد استخدم ميزات تحليل ELK وتصورها من قبل). تم بناء Elasticsearch على لوسين ويدعم استعلامات سريعة للغاية وبناء جملة الاستعلام الغني ، وأحيانًا بمثابة NOSQL خفيفة الوزن. ومع ذلك ، فإن القدرة على معقدة عمليات الاستعلام والتجميع ليست قوية للغاية.
لن تذكر هذه المقالة كيفية بناء خدمة بحث بسيطة ، ولكنها ستسجل العديد من المزالق التي تمت مواجهتها خلال ساعات العمل التي تبلغ حوالي أسبوع. .
لماذا تختار Elasticsearch 5.x؟
الخدمة الجديدة ليس لها عبء تاريخي ، ومن الناحية النظرية ، يجب أن تستخدم أحدث 6.x. ومع ذلك ، يدعم Dring-Data-Elasticsearch 5.x فقط ، ومن الصعب تغليف طبقة من واجهات برمجة التطبيقات مباشرة حتى لو كان الوقت ضيقًا. وذلك أيضًا لأن الإصدار السابق من أشياء Elk كان مرتبكًا ، لذلك لم يكن لديه خيار سوى الانتقال من 2.x إلى 5.x. الاستعلام عن الفرق بين 5.x و 2.x. ببساطة ، إنه مساحة القرص -50 ٪ ، وقت الفهرس -50 ٪ ، أداء الاستعلام +25 ٪.
نظرًا لأنه يجب ترقية Dring-Data-Elasticsearch إلى 3.0.7 ، يجب ترقية الربيع إلى 2.x ، مما يؤدي مباشرة إلى المزالق التي تم ضربها لاحقًا.
سوف يقوم Docker Installation ES بتثبيت البرنامج المساعد X-Path افتراضيًا
على الرغم من أن بيانات الربيع تدعم ES5.x ، إلا أن وظائفها ليست كاملة. لذلك ، إذا تم تثبيت المكون الإضافي X-path ، org.elasticsearch.client: x-pack-transport: 5.5.0 يجب تقديمه. يجب أن يكون الإصدار هو نفسه إصدار ES ، ويمكنك تطبيق TransportClient بنفسك ، على النحو التالي
@componentpublic class esconfig {bean public transportclient transportclient () يلقي unknownHostException {transportClient client = new prebuiltxpacktransportclient (settings.builder () .put ("cluster.name" ، "docker-clustr") .put ( .addTransportAddress (inetsocketTransportAddress جديد (inetaddress.getByName ("0.0.0.0") ، 9300)) ؛ إرجاع العميل ؛ }}هذا أيضًا حل أسرع يتم اختياره لأنني لا أريد الذهاب إلى Docker للتعامل مع المكون الإضافي X-Path. إذا كان الأمر غير ضروري ، فلست مضطرًا إلى لمس بعض الأشياء في ES نفسها في الوقت الحالي.
سيقوم MQ بحفظ معلومات فئة الرسالة ، مما تسبب في فشل تفشل
لم يتم ذكر RabbitMQ في العنوان ، لأنه يستخدم فقط كطاقة انتظار للرسالة. عندما تتغير البيانات ، يتم طرح معرف الرسالة في MQ ويتم استهلاك المستهلك في خدمة البحث.
المشكلة هي أنه عندما يتم إلقاء الرسالة في MQ ، يتم تغليفها في كائنها الخاص ، مما يسبب rabbittemplate.ReceiveAndConvert للفشل لأن الرسالة ستحمل معلومات حزمة الكائن. في اليأس ، لا يمكن للمستهلك الحصول على بايت الرسالة مباشرة في قائمة الانتظار ، وتحويل نموذج JSON إلى كائن باستخدام طريقة ObjectMapper.ReadValue.
يمكن أن يستخدم تكوين Gradle -dloader.main لتحديد وظيفة بدء التشغيل
وذلك على وجه التحديد لأنه يتم تقديم MQ أن خدمة البحث تحتاج إلى بدء المستهلك. تتمثل الطريقة في تطبيق تطبيق لا يبدأ خدمة الويب ، وتكوين SimpleMessageListenerContainer و MessagelistenerAdapter على النحو التالي:
bean simplemessageListenerContainer Container (connectionFactory ConnectionFactory ، messagelisteneradapter leacheradapter ، mqconfig properties) {simplemessageListenerContain Container = new SimplemessageListenerContainer () ؛ container.setConnectionFactory (connectionFactory) ؛ container.setqueuenames (properties.getqueuename ()) ؛ Container.setMessageListener (مستمع) ؛ إرجاع حاوية ؛ } bean messagelisteneradapter leaderadapter () {messagelisteneradapter leaderadapter = new messagelisteneradapter (itemConsumer ، "strume") ؛ إرجاع leacheradapter ؛ } المشكلة هي أنه عند تكوين Gradle ، بحثت لفترة طويلة لجعل حزمة JAR مصممة باستخدام adloader.main المحدد لتحديد تطبيق بدء التشغيل. الحل كما يلي:
أضف ملف xxx.gradle
bootjar {manesest {{السمات 'الفئة الرئيسية': 'org.springframework.boot.loader.propertiesLauncher'}}في مشروع Springboot 1.5.9 ، تحتاج إلى تحديد تطبيق بدء التشغيل وتحتاج إلى إضافته
Springboot {layout = "zip"}طريقة التحقق مما إذا كان فعالًا هي إلغاء الضغط مباشرة على حزمة الجرة بعد إنشاءها والتحقق منها في XXX (اسم المشروع)/MEMETA-INFO/MANIFEST.MF.
الفئة الرئيسية: org.springframework.boot.loader.propertiesLauncher
ثم صحيح ، إذا
الفئة الرئيسية: org.springframework.boot.loader.jarlauncher
ستظل فئة البدء في الملف
لا يمكن أن تعدل ES رسم خرائط الفهرس
نظرًا لأنه يستخدم ببساطة وظيفة البحث النصية لـ ES ، فهناك العديد من نتائج البحث غير المرضية في التطبيقات الفعلية ، مثل البحث عن "Desk" ، ومن المستحيل البحث عن محتوى مثل "مكتب الكمبيوتر/Office Desk" وغيرها من الجداول XX. هناك العديد من الحالات بهذه الطريقة. لذلك ، تتم إضافة قاموس مرادف ، ولا يتم استخدام مقطع الكلمات IK_SMART في الحقول التي تتطلب تجزئة الكلمات ، لذلك يجب تغيير تعيين بعض الحقول إلى
.
نظرًا لأنه لا يمكن تعديل رسم الخرائط ES '، يمكنك فقط إنشاء رسم خرائط جديد يدويًا ، ثم استخدام طريقة Reindex لإلغاء البيانات (ES5.x يأتي مع API Reindex). هناك طريقة عبر الإنترنت من خلال الاسم المستعار. في بعض سيناريوهات التعديل ، يمكنك تعديل التعيين بسلاسة دون إعادة تشغيل/نشر التطبيق. يمكنك الاستعلام وفهم التفاصيل.
ما سبق هو تقريبا المزالق التي تأثرت بها خدمة البحث. لقد استهلك العديد منهم الكثير من الوقت والطاقة لحلها. آمل أن تكون ذات قيمة مرجعية لهذه القائمة. في المستقبل ، سيكون هناك بعض التحسينات في خدمة البحث وسيستمر تحديثها ببطء. آمل أيضًا أن يدعم الجميع wulin.com أكثر.