عميل Elasticsearch للغة PHP: elasticsearch-php — دليل شامل

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

عميل Elasticsearch للغة PHP (elasticsearch-php): أداة قوية للبحث والتحليلات

\n\n

Elasticsearch هو نظام بحث وتحليلات موزع مبني على Apache Lucene. يتيح تخزين والبحث وتحليل كميات كبيرة من البيانات في الوقت الفعلي تقريبًا. للتفاعل مع Elasticsearch من تطبيقات PHP، يوجد عميل رسمي — elasticsearch-php. توفر هذه المكتبة واجهة برمجة تطبيقات (API) مريحة لتنفيذ جميع العمليات: من فهرسة المستندات إلى استعلامات البحث المعقدة والتجميعات.

\n\n

في هذه المقالة، سنشرح بالتفصيل تثبيت وإعداد والإمكانيات الأساسية لـ elasticsearch-php. ستتعلم كيفية الاتصال بالمجموعة (cluster)، إنشاء فهرس (index)، إضافة مستندات، تنفيذ البحث، واستخدام الوظائف المتقدمة مثل التصفية وتجميع البيانات.

\n\n

تثبيت elasticsearch-php

\n\n

يتم توزيع المكتبة عبر Composer. للتثبيت، قم بتنفيذ الأمر التالي في جذر مشروعك:

\n\n
composer require elasticsearch/elasticsearch
\n\n

بعد التثبيت، سيظهر التبعية في ملف composer.json. تأكد من أن لديك PHP الإصدار 7.4 أو أعلى، بالإضافة إلى امتداد json.

\n\n

الاتصال بخادم 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) بسيط:

\n\n
$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:

\n\n
$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                    

توصيات