عميل Elasticsearch لـ Node.js (@elastic/elasticsearch)
مكتبة @elastic/elasticsearch هي عميل HTTP رسمي عالي الأداء للتفاعل مع Elasticsearch من بيئة Node.js. توفر واجهة برمجة تطبيقات (API) مريحة لتنفيذ جميع العمليات: من فهرسة المستندات البسيطة إلى استعلامات البحث المعقدة والتجميعات. تدعم المكتبة بالكامل جميع إصدارات Elasticsearch 7.x و 8.x، بما في ذلك العمل مع المجموعات (clusters)، المصادقة، وضغط البيانات.
التثبيت
للتثبيت، استخدم npm أو yarn:
npm install @elastic/elasticsearch# أوyarn add @elastic/elasticsearchالاتصال الأساسي
أنشئ مثيلاً للعميل مع تحديد عنوان خادم Elasticsearch. بالنسبة للإصدار 8.x، يلزم إعداد TLS ومفتاح API أو اسم مستخدم/كلمة مرور.
const { Client } = require('@elastic/elasticsearch');
// الاتصال بالخادم المحلي (Elasticsearch 7.x)const client = new Client({ node: 'http://localhost:9200' });
// الاتصال بخادم Elastic Cloud (8.x)const cloudClient = new Client({ cloud: { id: 'my-cloud-id' }, auth: { apiKey: 'base64EncodedApiKey' }});العمليات الأساسية
1. فهرسة (إضافة) مستند
طريقة index تضيف أو تستبدل مستنداً في الفهرس المحدد.
async function indexDocument() { const result = await client.index({ index: 'articles', id: '1', body: { title: 'عميل Elasticsearch لـ Node.js', content: 'وصف تفصيلي للمكتبة...', tags: ['elasticsearch', 'node.js'], published: true, views: 150 } }); console.log('تمت فهرسة المستند:', result.result);}indexDocument();2. البحث عن المستندات
طريقة search تنفذ بحثاً نصياً كاملاً باستخدام Query DSL.
async function searchDocuments() { const { body } = await client.search({ index: 'articles', body: { query: { bool: { must: [ { match: { title: 'Elasticsearch' } }, { term: { published: true } } ], filter: [ { range: { views: { gte: 100 } } } ] } } } });
console.log('عدد المستندات التي تم العثور عليها:', body.hits.total.value); body.hits.hits.forEach(hit => { console.log(`- ${hit._source.title} (الصلة: ${hit._score})`); });}searchDocuments();3. الحصول على مستند بواسطة المعرف (ID)
async function getDocument() { try { const { body } = await client.get({ index: 'articles', id: '1' }); console.log('المستند:', body._source); } catch (error) { if (error.meta.statusCode === 404) { console.log('المستند غير موجود'); } else { console.error('خطأ:', error); } }}getDocument();4. تحديث مستند (جزئي)
async function updateDocument() { const { body } = await client.update({ index: 'articles', id: '1', body: { doc: { views: 151, updated_at: new Date().toISOString() } } }); console.log('تم تحديث المستند، الإصدار:', body._version);}updateDocument();5. حذف مستند
async function deleteDocument() { const { body } = await client.delete({ index: 'articles', id: '1' }); console.log('نتيجة الحذف:', body.result);}deleteDocument();العمل مع التجميعات (Aggregations)
تسمح التجميعات بالحصول على بيانات إحصائية بناءً على نتائج البحث.
async function aggregateByTags() { const { body } = await client.search({ index: 'articles', body: { size: 0, // عدم إرجاع المستندات نفسها aggs: { popular_tags: { terms: { field: 'tags.keywor