عميل Elasticsearch للغة PHP (elasticsearch-php): أداة قوية للبحث والتحليلات
\n\nElasticsearch هو نظام بحث وتحليلات موزع مبني على Apache Lucene. يتيح تخزين والبحث وتحليل كميات كبيرة من البيانات في الوقت الفعلي تقريبًا. للتفاعل مع Elasticsearch من تطبيقات PHP، يوجد عميل رسمي — elasticsearch-php. توفر هذه المكتبة واجهة برمجة تطبيقات (API) مريحة لتنفيذ جميع العمليات: من فهرسة المستندات إلى استعلامات البحث المعقدة والتجميعات.
\n\nفي هذه المقالة، سنشرح بالتفصيل تثبيت وإعداد والإمكانيات الأساسية لـ elasticsearch-php. ستتعلم كيفية الاتصال بالمجموعة (cluster)، إنشاء فهرس (index)، إضافة مستندات، تنفيذ البحث، واستخدام الوظائف المتقدمة مثل التصفية وتجميع البيانات.
\n\nتثبيت elasticsearch-php
\n\nيتم توزيع المكتبة عبر Composer. للتثبيت، قم بتنفيذ الأمر التالي في جذر مشروعك:
\n\ncomposer require elasticsearch/elasticsearch\n\nبعد التثبيت، سيظهر التبعية في ملف composer.json. تأكد من أن لديك PHP الإصدار 7.4 أو أعلى، بالإضافة إلى امتداد json.
الاتصال بخادم Elasticsearch
\n\nالخطوة الأولى هي إنشاء العميل. بالنسبة للخادم المحلي (افتراضيًا، يستمع Elasticsearch على المنفذ 9200)، سيكون الكود كالتالي:
\n\n<?php\nrequire 'vendor/autoload.php';\n\nuse Elastic\\Elasticsearch\\ClientBuilder;\n\n$client = ClientBuilder::create()\n ->setHosts(['localhost:9200'])\n ->build();\n?>\n\nإذا كان خادمك يتطلب مصادقة (على سبيل المثال، عبر اسم مستخدم/كلمة مرور أو مفتاح API)، قم بتمرير المعاملات:
\n\n$client = ClientBuilder::create()\n ->setHosts(['https://user:pass@localhost:9200'])\n ->setSSLVerification(false) // للتطوير فقط\n ->build();\n\nالعمل مع الفهارس والمستندات
\n\nيقوم Elasticsearch بتخزين البيانات في فهارس (مشابهة للجداول في SQL). لنقم بإنشاء فهرس products مع تعيين (mapping) بسيط:
$params = [\n 'index' => 'products',\n 'body' => [\n 'settings' => [\n 'number_of_shards' => 1,\n 'number_of_replicas' => 0\n ],\n 'mappings' => [\n 'properties' => [\n 'title' => ['type' => 'text'],\n 'price' => ['type' => 'float'],\n 'description' => ['type' => 'text'],\n 'category' => ['type' => 'keyword']\n ]\n ]\n ]\n];\n\n$response = $client->indices()->create($params);\n\nالآن لنقم بإضافة بعض المستندات:
\n\n$documents = [\n ['title' => 'لابتوب Dell XPS 15', 'price' => 1200.00, 'description' => 'ألترابوك قوي للعمل', 'category' => 'electronics'],\n ['title' => 'كتاب "PHP للمحترفين"', 'price' => 45.50, 'description' => 'تعلم PHP على مستوى متقدم', 'category' => 'books'],\n ['title' => 'سماعات Sony WH-1000XM5', 'price' => 350.00, 'description' => 'سماعات لاسلكية مع إلغاء الضوضاء', 'category' => 'electronics']\n];\n\nforeach ($documents as $id => $doc) {\n $params = [\n 'index' => 'products',\n 'id' => $id + 1,\n 'body' => $doc\n ];\n $response = $client->index($params);\n}\n\nالبحث عن المستندات
\n\nلنقم بإجراء بحث نصي كامل في الحقل title:
$params = [\n 'index' => 'products',\n 'body' => [\n 'query' => [\n 'match' => [\n 'title' => 'لابتوب'\n ]\n ]\n ]\n];\n\n$response = $client->search($params);\n$hits = $response['hits']['hits'];\n\nforeach ($hits as $hit) {\n echo "ID: " . $hit['_id'] . " | Title: " . $hit['_source']['titl