عميل Elasticsearch لجافا سكريبت (Node.js) — @elastic/elasticsearch
\n\nElasticsearch هو نظام بحث وتحليل موزع وقوي، مبني على قاعدة Apache Lucene. يتيح إجراء البحث النصي الكامل، تجميع البيانات وتحليل السجلات في الوقت الفعلي. للتفاعل مع Elasticsearch من تطبيقات Node.js، يوجد عميل رسمي — @elastic/elasticsearch. يوفر واجهة برمجة تطبيقات (API) مريحة لجميع العمليات: من الاتصال بالمجموعة إلى استعلامات البحث المعقدة.
المكتبة تدعم بشكل كامل جميع إصدارات Elasticsearch 7.x و 8.x، وتعمل بشكل غير متزامن باستخدام الـ Promises، وهي مثالية لبناء خدمات بحث وتحليل ومراقبة عالية التحميل. في هذه المقالة، سنستعرض التثبيت، الإعداد الأساسي، والعمليات الرئيسية على البيانات باستخدام Node.js.
\n\nالتثبيت والاتصال
\n\nيتم تثبيت العميل عبر مدير الحزم npm:
\n\nnpm install @elastic/elasticsearch\n\nبعد التثبيت، يجب إنشاء نسخة من العميل مع تحديد عنوان خادم Elasticsearch، وإذا لزم الأمر، معلمات المصادقة:
\n\nconst { Client } = require('@elastic/elasticsearch');\n\nconst client = new Client({\n node: 'http://localhost:9200',\n auth: {\n username: 'elastic',\n password: 'changeme'\n }\n});\n\nللعمل مع خدمة Elastic Cloud السحابية، يُستخدم المعامل cloud.id و auth.apiKey.
العمل مع الفهارس
\n\nالفهرس في Elasticsearch هو ما يعادل قاعدة البيانات في أنظمة إدارة قواعد البيانات العلائقية. دعنا نستعرض العمليات الأساسية.
\n\nإنشاء فهرس
\n\nasync function createIndex() {\n const response = await client.indices.create({\n index: 'products',\n body: {\n settings: {\n number_of_shards: 1,\n number_of_replicas: 1\n },\n mappings: {\n properties: {\n title: { type: 'text' },\n description: { type: 'text' },\n price: { type: 'float' },\n created_at: { type: 'date' }\n }\n }\n }\n });\n console.log('تم إنشاء الفهرس:', response);\n}\n\nحذف فهرس
\n\nasync function deleteIndex() {\n await client.indices.delete({ index: 'products' });\n console.log('تم حذف الفهرس');\n}\n\nإضافة وتحديث المستندات
\n\nالمستند هو وحدة البيانات الأساسية في Elasticsearch. دعنا نضيف بعض السجلات إلى الفهرس products:
async function addDocuments() {\n const doc1 = {\n title: 'لابتوب Apple MacBook Pro',\n description: 'لابتوب قوي للمطورين والمصممين',\n price: 2499.99,\n created_at: new Date()\n };\n\n const doc2 = {\n title: 'لوحة مفاتيح ميكانيكية Logitech',\n description: 'لوحة مفاتيح لاسلكية مع إضاءة خلفية',\n price: 149.99,\n created_at: new Date()\n };\n\n // إضافة مع تحديد المعرف\n await client.index({\n index: 'products',\n id: '1',\n body: doc1\n });\n\n // إضافة بدون معرف (توليد تلقائي)\n await client.index({\n index: 'products',\n body: doc2\n });\n\n // الكتابة الإجبارية على القرص\n await client.indices.refresh({ index: 'products' });\n}\n\nللتحديث الجزئي، يُستخدم الأسلوب update:
await client.update({\n index: 'products',\n id: '1',\n body: {\n doc: {\n price: 2399.99\n }\n }\n});\n\nالبحث عن البيانات
\n\nيوفر Elasticsearch لغة DSL قوية لبناء الاستعلامات. دعنا نستعرض بعض الأمثلة.
\n\nالبحث النصي الكامل
\n\nasync function searchProducts(query) {\n const response = await client.search({\n index: 'products',\n body: {\n query: {\n match: {\n description: query\n }\n }\n }\n });\n\n console.log('عدد المستندات التي تم العثور عليها:', response.hits.total.value);\n response.hits.hits.forEach