كانت نيتي في بناء هذا الريبو هي مشاركة معرفتي الموجزة حول هذا الموضوع: البحث الكامل للنص ، أو فقط FTS . كما سترى أنني قد أجريت بعض الاختبارات والبحث للوصول إلى هذا الاستنتاج ، فإن بعض الروابط في القسم الأخير يمكن أن تساعد أي شخص يريد أن يفهم ما قرأته (لماذا لا؟) حتى يساعد في تقديم بعض المساهمات في هذا المستودع بالذات (يتم تقدير العلاقات العامة).
يحتوي هذا المستودع على API 6.x Rails 6.x الذي يستخدم GEM SearchKick لإنتاج توصيات رائعة (بواسطة FTS) بناءً على مدخلات المستخدم. إنها واجهة برمجة تطبيقات HTTP بسيطة بسيطة تتيح لك إنشاء منشورات مع حقول العنوان والجسم (كما سترى لاحقًا) وتجري عمليات البحث التي تقارب توصيات جيدة ، وليس فقط مقارنة سلسلة Simples. لهذا الغرض ، سأبدأ في التحقيق في ما إذا كانت هناك حلول أخرى لنهج FTS إلى جانب Elasticsearch.
يمكن أن يجلب لك "googling" البسيط مجموعة من الطرق لأداء FTS في DBMs أكثر شيوعًا مثل MySQL أو PostgreSQL. من الأفضل دائمًا اختيار بديل أكثر اختبارًا ونشرًا ضد "جديد" - حتى Elasticsearch ليست تلك التكنولوجيا الشابة - فيما يتعلق بموثوقية المجتمع والبرامج. فلماذا لا تختار الفضة القديمة بين postgresql و mysql؟
هناك طريقتان يمكن أن يكون لدينا FTS في MySQL: البحث في اللغة الطبيعية والبحث المنطقي. يعد البحث اللغوي أكثر وضوحًا لفهمنا لأنه يبحث ببساطة عن كلمة كلمة مقارنة الاستعلام مع الحقول التي تحددها. سوف تسجل الصفوف التي لديها المزيد من المراسلات مع سلسلة الاستعلام الخاصة بك أكثر ويتم تصنيفها من خلال هذه النتيجة بالذات. درجة الصفر تعني عدم وجود مراسلات وأن الصفوف لا يتم إرجاعها في mysql fts. تحقق من هذا المثال ( الأجزاء المفرطة التي يمكن أن تكون حساسة ):
SELECT CASE WHEN LENGTH(content) > 140
THEN CONCAT( SUBSTRING (content, 1 , 140 ), ' ... ' )
ELSE content
END AS adapted_content,
MATCH(content) AGAINST ( ' lei ' IN NATURAL LANGUAGE MODE) AS score
FROM posts;في النهج المنطقي ، يمكنك استخدام بعض الأدوات الأخرى التي يمكنها تغيير "النتيجة" لكل كلمة بشكل فردي. باستخدام وضع اللغة الطبيعية ، يمكنك العثور على بعض التطابقات الجيدة ومن السهل تنفيذها ، بشكل أساسي إذا قمنا بمقارنة الوضع المنطقي. ولكن هذا لا يغطي حالات الاستخدام عندما يكتب المستخدم الإدخال بشكل غير صحيح. لذلك يتوقع من المستخدم طريقة دقيقة للكتابة - وهذه ليست الحقيقة أبدًا. نفس الحالة لـ postgresql: هناك بعض الطرق التي يمكنك القيام بها ، ولكن. هنا لدينا مشكلة يمكننا حلها فقط عن طريق تحليل السلسلة أعمق . انظر عندما نغير فقط "lei" إلى "le" (إزالة "i ') ، وهذا يحدث لدرجاتنا:
من أجل حل هذه القضية ، تم تنفيذ Elasticsearches الخاص بـ FTS مع Java Lucene Engine. إنه يجلب لنا مجموعة من الأدوات مثل تفسير الأخطاء الإملائية ، والمواقف الناجمة والخاصة - como acentos na minha língua pátria! - وغيرهم. يمكن أن تكون كل هذه الأشياء معقدة حقًا لتطويرها بمفردنا ، لذلك من المبرر للغاية استخدام Elasticsearch إذا كنت تبحث عن هذه الأدوات.
$ gem install bundler
$ git clone [email protected]:abmBispo/rails-autocomplete.git
$ cd rails-autocomplete
$ bundle installمن السهل جدًا تشغيل حاويات تبعيات خدمة Rails هذه - PostgreSQL و Elasticsearch - بدلاً من تثبيتها في جهازك. يمكن أن يساعدك ذلك على التعامل بشكل أفضل مع العمليات وإدارة الذاكرة والتخزين. حتى هنا حصلت على مقتطف للقيام بذلك بالضبط:
$ docker run --name postgres-database -e POSTGRES_PASSWORD=postgres -d -p 5432:5432 -v $HOME /docker/volumes/postgres:/var/lib/postgresql/data postgres
$ docker run --name elasticsearch -p 9200:9200 -p 9300:9300 -d -e " discovery.type=single-node " docker.elastic.co/elasticsearch/elasticsearch:7.6.2إذا كنت جديدًا في Docker ولم يكن لديك سوى الصور التي تعمل ، فيمكنك إيقاف تشغيلها فقط عن طريق التنفيذ:
$ sudo docker stop $( sudo docker ps -a -q )وتشغيله مرة أخرى مع:
$ sudo docker start $( sudo docker ps -a -q -f " status=exited " ) $ bin/rails db:create db:migrate db:seed $ bin/rails sهنا يمكنك الحصول على وثائق موجزة على ساعي البريد على API البحث وإنشاء.