لا تتضمن هذه المقالة مبادئ محددة لـ Elasticsearch ، ولكنها تسجل فقط كيفية استيراد البيانات بسرعة في MySQL للبحث عن النص الكامل.
في العمل ، تحتاج إلى تنفيذ وظيفة البحث واستيراد بيانات قاعدة البيانات الموجودة. يوصي قائد الفريق باستخدام Elasticsearch لتنفيذها. يمكنك البحث من خلال البرامج التعليمية عبر الإنترنت ، وهي مقالات قديمة نسبيًا. ليس لدي خيار سوى استكشاف ذلك بنفسي. ارجع إلى وثائق ES وأخيراً بناء الخدمة. سوف أسجله. آمل أن يتمكن الأصدقاء الذين لديهم نفس الاحتياجات من تجنب التحويلات ويمكنهم بناء خدمة Elasticsearch المتاحة بسرعة وفقًا لهذا البرنامج التعليمي.
ES البناء
يمكن لـ ES Builds تنزيل ملفات zip مباشرة وحاويات Docker. نسبيا ، Docker أكثر ملاءمة لنا لتشغيل خدمات ES. من الممكن بناء مجموعة أو إنشاء بيئة اختبار بسهولة. يتم استخدام طريقة الحاوية أيضًا هنا. أولاً ، نحتاج إلى Dockerfile:
من docker.elastic.co/elasticsearch/elasticsearch-oss:6.0.0.0# إرسال التكوين يتضمن elasticsearch.yml و keystore.jks files نسخ-chown = elasticsearch: elasticsearch conf//usr/share/elasticsearch/config/# install ./bin/elasticesearch https://github.com/medcl/elasticsearch-analysis-ik/release/download/v6.0.0/elasticsearch-analysis-ik- https://github.com/hyyyu/beziercurvedemo/raw/master/readonlyrest-1.16.14_es6.0.sipuser elasticsearchcmd ./bin/elasticsearch
فيما يلي تفسير للعملية أعلاه:
التكوين elictic elasticsearch.yml
cluster.name: "Docker-Cluster" network.host: 0.0.0.0# minimum_master_nodes يجب ضبطها بشكل صريح عند ربطها على عنوان IP عام واحد للسماح بمجموعات عقدة واحدة# التفاصيل: https://github.com/elastic/elasticsearch es bootstrap.memory_lock: true http.type: ssl_netty4readonlyrest: تمكين: ssl true: enable: true keystore_file: "server.jks" keystore_pass: server key_pass: server Access_Control_Rules: - tame: "block 1 - type group: ["المستخدم"] المؤشرات: ["paper*"] الإجراءات: ["المؤشرات: البيانات/القراءة/*"] المستخدمين: - اسم المستخدم: root uled_key_sha256: CB7C98BAE153065DB931980A13BD45EE3A77CB8F27A7DFEE68F68677777777 Xiaoming Auth_key: Xiaoming: مجموعات Xiaoming: ["المستخدم"]
هنا bootstrap.memory_lock: True هو حفرة ، يحظر تبادل الذاكرة. أوضحت الوثيقة بالفعل أن بعض نظام التشغيل سوف يتبادل الذاكرة غير المستخدمة مؤقتًا إلى منطقة من القرص الصلب أثناء وقت التشغيل. ومع ذلك ، فإن هذا السلوك سوف يرتفع معدل استخدام الموارد من ES ، وحتى جعل النظام غير قادر على الاستجابة.
من الواضح بالفعل في ملف التكوين أن المستخدم الجذر ينتمي إلى مجموعة المسؤول ، ويحتوي المسؤول على جميع الأذونات. نظرًا لأن Xiaoming موجود في مجموعة المستخدمين ، فيمكنه الوصول فقط إلى فهرس الورق ، ولا يمكنه القراءة إلا ، لكن لا يمكنه العمل. لمزيد من التكوين التفصيلي ، يرجى الاطلاع على: وثائق ReadOnlyRest
في هذه المرحلة ، تم الانتهاء من الاستعدادات لـ ES. Docker Build -T Esimage: Tag. Docker Run -P 9200: 9200 ESIMAGE: TAG RUN.
إذا https://127.0.0.1:9200/ الإرجاع
{"name": "vakwrir" ، "cluster_name": "docker-cluster" ، "cluster_uuid": "2017-11-10T18: 41: 22.859z" ، "build_snapshot": false ، "lucene_version":ظهر بطل الرواية من البرنامج التعليمي. سوف أشارك العديد من واجهات برمجة التطبيقات شائعة الاستخدام لإثارة وتصحيح الأخطاء:
يتم استبدال {{url}} بعنوان ES المحلي.
استيراد بيانات MySQL
أنا أستخدم بيانات MySQL هنا ، ولكن في الواقع ، فإن قواعد البيانات الأخرى هي نفسها. المفتاح هو كيفية الاستيراد. سيوصي البرنامج التعليمي عبر الإنترنت بمكون MySQL لـ Logstash و Beat و ES للاستيراد. لقد جربته أيضا. التكوين مرهق والمستندات متناثرة. إذا كانت بنية قاعدة البيانات معقدة بعض الشيء ، فإن الاستيراد هو مهمة شاقة ، لذلك لا ينصح بها. في الواقع ، لدى ES مكتبات API المقابلة في كل لغة. يمكنك تجميع البيانات في JSON على مستوى اللغة وإرسالها إلى ES من خلال مكتبة API. العملية تقريبًا على النحو التالي:
يمكنني استخدام مكتبة ES المرنة Golang. يمكنك البحث على github عن لغات أخرى ، وطريقة التشغيل هي نفسها.
بعد ذلك ، استخدم قاعدة بيانات بسيطة لتقديمها:
جدول الورق
| بطاقة تعريف | اسم |
|---|---|
| 1 | بكين رقم 1 محاكاة المدرسة الابتدائية |
| 2 | Jiangxi Beijing General College Examing Examination |
جدول المقاطعة
| بطاقة تعريف | اسم |
|---|---|
| 1 | بكين |
| 2 | Jiangxi |
paper_province table
| paper_id | PRONTINCE_ID |
|---|---|
| 1 | 1 |
| 2 | 1 |
| 2 | 2 |
كما ذكر أعلاه ، فإن الورقة والمقاطعة هي علاقات كثيرة. الآن يتم إدخال البيانات الورقية في ES ، يمكنك البحث عن طريق اسم الورق أو التصفية عبر المقاطعة. تنسيق بيانات JSON كما يلي:
{"id": 1 ، "name": "Beijing No. قم أولاً بإعداد ملف mapping.json ، وهو تعريف بنية التخزين للبيانات في ES.
{"mappings": {"docs": {"include_in_all": false ، "properties": {"id": {"type": "long" ، "name": {"type": "text" ، "ID": {"type": "integer"} ، "name": {"type": "text" ،تجدر الإشارة إلى أنه تم إلغاء حقل _. سيجمع هذا الافتراضي _all جميع حقول التخزين لتحقيق بحث مقيد غير مشروط. العيب هو أن المساحة تشغل الكثير.
قمت بتعيين رقم Shard على 1 ، ولم يتم تعيين النسخ المتماثلة. بعد كل شيء ، هذه ليست كتلة والبيانات المعالجة ليست كثيرا. إذا كان هناك كمية كبيرة من البيانات التي يجب معالجتها ، فيمكنك ضبط عدد القطع والنسخ المتماثلة بنفسك.
أولاً ، إنشاء اتصال مع ES ، يرتبط CA.CRT بالتوقيع الذاتي JKS. بالطبع ، أنا هنا أستخدم InsecuresKipverify لتجاهل التحقق من ملف الشهادة.
func initelasticsearch () {pool: = x509.newcertpool () crt ، err0: = ioutil.readfile ("conf/ca.crt") if err0! = nil {لا يمكن (err0 ، "read crt file") return} pool.appendcertsfrompem (crt) tr: = & tls.config {rootcas: pool ، insecureskipverify: true} ،} httpclient: = & http.client {transport: tr} // construct construct leastclient var error ericlient ، err = lostic.newckient (letimt.seturl (myconfig.elasticurl) مرنة. "search_client_error") return} // يتم الانتهاء من بناء clastclient // استعلام ما إذا كان هناك فهرس الورق موجود ، err: = lextclient.indexexists (myConfig.elasticIndexName) .do (context.background ()) إذا كان موجودًا {if! isIndexIntgrity (localClient) {// حذف الفهرس الحالي والاستعداد لإعادة بناء leferesponse ، err: = lextclient.deleteIndex (myConfig.ElastIndexName) .do (context.background ()) إذا err! = nil || ! deleteresponse.acknowledged {لا يمكن أن تكون (err ، "delete_index_error") return}} {return}} // background Query Query Database وأرسل البيانات إلى Elasticsearch go اكتب papersearch struct {paperid int64 `gorm:" primary_key ؛ العمود: f_paper_id ؛ النوع: bigint (20) "json:" id "` name string `Gorm: JSON: "المقاطعات" `// المقاطعات التي تكون ورقة الاختبار قابلة للتطبيق} func fetchdbgetAllPaperSendToes () {// جلب الورق var allpaper [] papersearch getDB (). getDB (). table ("t_provinces"). ينضم ("Inner inner` t_paper_province` on `t_paper_province`. AllPaper [i] .paperid) .find (& allpro) AllPaper [i] .provinces = allpro} إذا كان len (allpaper)> 0 {// send to es - create index createService: = getelasticsearch (). createIndex (myconfig.elasticIndexName) // index_default_setting هنا هو المحتوى في moing ksing appetjson أعلاه. CreateService.body (index_default_setting) crateSult ، err: = createService.do (context.background ()) - إرسال جميع الورق BulkRequest: = getelasticsearch (). bulk () لـ i: = Range allpaper {indexReq: = lext.newbulkindexrequest (). optype ("create"). index (myConfig.ElasticIndexName) .type ("docs". doc (allpaper [i]) bulkrequest.add (indexReq)} // do يرسل طلبات السائبة إلى elasticsearch bulkresponse ، err: = bulkrequest.do (context.background ()) ! = len (allpaper) {لا يمكنوبن (err ، "insert_docs_nums_error") return} // إرسال النجاح}} بعد التشغيل من خلال الكود أعلاه ، استخدم {{url}}/_ cat/inster؟ v لمعرفة ما إذا كان الفهرس الذي تم إنشاؤه حديثًا في ES ، واستخدم {{url}}/_search لمعرفة عدد المستندات التي تصل إلى. إذا كان عدد المستندات مساوياً لمقدار البيانات التي أرسلتها في الماضي ، فسيتم اعتبار خدمة البحث قيد التشغيل.
يبحث
يمكنك الآن البحث عن أوراق الاختبار بواسطة ProvinceId و Q ، ويتم فرز الافتراضي عن طريق درجة الأهمية.
. courseid ، desidentid ، provinceid ، papertypeid ، limit ، page)} list = make ([] paperSimple ، 0) TotalPage = 0 currentpage = page pageIsend = 0 returnerr = nil client: = getelasticsearch () إذا كان العميل == nil {return searchpaperlocal (q ، Quitid ، dateid ، papertinid ، papeid ، eles extail قاعدة بيانات للبحث إذا! isIndexIntegrity (عميل) {return searchpaperlocal (Q ، coursid ، dreneid ، provinceid ، papertypeid ، limit ، page)} if! client.isrunning () {client.start ()} defer : = altock.newmatchquery ("الاسم" ، Q) // المقاطعة إذا كانت المقاطعة> 0 && provinceId! = default_province_all {probool: = letastic.newboolquery () tpro: = leastic.newtermquery ("incultins.id) boolquery.must (pronest)} boolquery.must (matchquery) لـ _ ، e: = range termquerys {boolquery.must (e)} aightliztt: = lexting.newhighlight () fighlight.field (lext_search_search_name_name) perfect.pretags Aightly.posttags (lext_search_search_field_tag_end) SearchResult ، err2: = client.search (myConfig.elasticIndexName). تسليط الضوء (Highligt). الاستعلام (boolquery). من ((صفحة - 1) * الحد). الحجم (الحد). do (context.background ()) إذا err2! = nil {// handle error getLogger (). logerr ("حدث خطأ أثناء البحث"+err2.error () ، "search_error") searchResressult.hits.hits {var p papersearch err: = json.unmarshal (*hit.source ، & p) إذا أخطأ! = nil {// فشل deserialization getLogger (). len (hit.highlight [lext_search_search_field_name])> 0 {p.name = hit.highlight [lext_search_search_field_name] [0]} list = append (list ، p)} count: = searchresult.totalhits () currentpage = page count> 0 {totalpage = float64 (limit)))} إذا كانت CurrentPage> = TotalPage {pageIsend = 1}} آخر {// no thits}} return}ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.