الخلاصة
واجهات برمجة التطبيقات (APIs) لـ Elasticsearch تدعم البحث والتحليلات على نطاق واسع. يمكنك فهرسة المستندات بصيغة JSON، والاستعلام باستخدام لغة استعلام قوية (DSL)، وتجميع النتائج للتحليلات. المصادقة تتم عبر مفاتيح API أو المصادقة الأساسية. لاختبار الاستعلامات والتعيينات والتجميعات قبل النشر في الإنتاج، استخدم Apidog.
مقدمة
Elasticsearch هو محرك بحث وتحليلات موزع يدعم النصوص المهيكلة والسجلات والمقاييس وغير ذلك. يُستخدم في البحث النصي الكامل في التطبيقات، وتحليل السجلات، ولوحات المعلومات التحليلية في الوقت الفعلي.
يوجد Elasticsearch في قلب مكدس ELK (Elasticsearch, Logstash, Kibana)، ويمكن استخدامه مباشرةً عبر API بدون Logstash.
💡 إذا كنت تطوّر ميزات بحث أو تحليلات سجلات، يسهّل عليك Apidog اختبار الاستعلامات، التحقق من التعيينات، وتصحيح التجميعات. يمكنك أيضًا حفظ ومشاركة قوالب البحث مع فريقك.
اختبر واجهات برمجة تطبيقات Elasticsearch باستخدام Apidog - مجانًا
بنهاية هذا الدليل ستتمكن من:
- فهرسة وإدارة المستندات
- كتابة استعلامات البحث باستخدام لغة استعلام Elasticsearch (DSL)
- استخدام التجميعات للتحليلات
- تكوين التعيينات والمحللات
- مراقبة صحة الكتلة
البدء
تشغيل Elasticsearch محليًا
# Docker
docker run -p 9200:9200 \
-e "discovery.type=single-node" \
elasticsearch:8.11.0
# أو حمله من elastic.co
التحقق من التثبيت
curl -X GET "http://localhost:9200"
الاستجابة المتوقعة:
{
"name": "elasticsearch-1",
"cluster_name": "elasticsearch",
"cluster_uuid": "abc123",
"version": {
"number": "8.11.0",
"build_flavor": "default"
},
"tagline": "You know, for search"
}
المصادقة
بدءًا من Elasticsearch 8.x، يُطلب المصادقة افتراضيًا:
curl -X GET "http://localhost:9200/_cluster/health" \
-u elastic:your_password
أو استخدم مفاتيح API (أنشئها من Kibana أو عبر API).
الفهارس والمستندات
إنشاء فهرس
اضبط إعدادات الفهرس والتعيينات عبر الأمر التالي:
curl -X PUT "http://localhost:9200/products" \
-u elastic:your_password \
-H "Content-Type: application/json" \
-d '{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0
},
"mappings": {
"properties": {
"name": { "type": "text" },
"price": { "type": "float" },
"category": { "type": "keyword" },
"in_stock": { "type": "boolean" },
"created_at": { "type": "date" }
}
}
}'
فهرسة مستند
curl -X POST "http://localhost:9200/products/_doc" \
-u elastic:your_password \
-H "Content-Type: application/json" \
-d '{
"name": "Wireless Headphones",
"price": 79.99,
"category": "electronics",
"in_stock": true,
"created_at": "2026-03-24T10:00:00Z"
}'
الاستجابة:
{
"_index": "products",
"_id": "abc123",
"_version": 1,
"result": "created",
"_seq_no": 0,
"_primary_term": 1
}
الحصول على مستند
curl -X GET "http://localhost:9200/products/_doc/abc123" \
-u elastic:your_password
تحديث مستند
curl -X PUT "http://localhost:9200/products/_doc/abc123" \
-u elastic:your_password \
-H "Content-Type: application/json" \
-d '{
"name": "Wireless Headphones Pro",
"price": 99.99,
"category": "electronics",
"in_stock": true,
"created_at": "2026-03-24T10:00:00Z"
}'
حذف مستند
curl -X DELETE "http://localhost:9200/products/_doc/abc123" \
-u elastic:your_password
عمليات مجمعة
فهرسة عدة مستندات دفعة واحدة:
curl -X POST "http://localhost:9200/products/_bulk" \
-u elastic:your_password \
-H "Content-Type: application/x-ndjson" \
-d '{"index":{"_id":"1"}}
{"name":"Product A","price":10.99,"category":"books","in_stock":true}
{"index":{"_id":"2"}}
{"name":"Product B","price":20.99,"category":"electronics","in_stock":false}
'
استعلامات البحث
بحث أساسي
curl -X GET "http://localhost:9200/products/_search" \
-u elastic:your_password \
-H "Content-Type: application/json" \
-d '{
"query": {
"match": {
"name": "headphones"
}
}
}'
استعلامات Bool
ادمج شروط متعددة عبر الاستعلامات المركبة:
{
"query": {
"bool": {
"must": [
{ "match": { "name": "headphones" } }
],
"filter": [
{ "term": { "category": "electronics" } },
{ "range": { "price": { "lte": 100 } } },
{ "term": { "in_stock": true } }
]
}
}
}
بحث بالنص الكامل مع التقييم
{
"query": {
"multi_match": {
"query": "wireless audio headphones",
"fields": ["name^2", "description"],
"type": "best_fields",
"fuzziness": "AUTO"
}
}
}
لاحظ: الحقول مثل name^2 تحصل على وزن أعلى في التقييم.
بحث العبارات
للعثور على عبارات مطابقة بدقة:
{
"query": {
"match_phrase": {
"description": "noise canceling"
}
}
}
البحث بالحروف البديلة والتعبيرات العادية
{
"query": {
"wildcard": {
"name": "*headphone*"
}
}
}
الفرز
{
"query": { "match_all": {} },
"sort": [
{ "price": "asc" },
{ "_score": "desc" }
]
}
التقسيم إلى صفحات
{
"from": 20,
"size": 10,
"query": { "match_all": {} }
}
التجميعات
التجميعات تستخدم للحصول على إحصائيات سريعة حول بياناتك.
متوسط السعر حسب الفئة
curl -X GET "http://localhost:9200/products/_search" \
-u elastic:your_password \
-H "Content-Type: application/json" \
-d '{
"size": 0,
"aggs": {
"by_category": {
"terms": { "field": "category" },
"aggs": {
"avg_price": { "avg": { "field": "price" } },
"min_price": { "min": { "field": "price" } },
"max_price": { "max": { "field": "price" } }
}
}
}
}'
مخطط بياني للأسعار
{
"size": 0,
"aggs": {
"price_histogram": {
"histogram": {
"field": "price",
"interval": 25
}
}
}
}
مخططات بيانية زمنية
{
"size": 0,
"aggs": {
"sales_over_time": {
"date_histogram": {
"field": "created_at",
"calendar_interval": "month"
}
}
}
}
العددية (العدد الفريد)
{
"size": 0,
"aggs": {
"unique_categories": {
"cardinality": { "field": "category" }
}
}
}
التعيينات والمحللات
أنواع الحقول
| النوع | يستخدم لـ |
|---|---|
text |
بحث بالنص الكامل، محلل |
keyword |
قيم دقيقة، تصفية، فرز |
integer, float
|
الأرقام |
boolean |
صحيح/خطأ |
date |
التواريخ والأوقات |
object |
كائنات JSON متداخلة |
nested |
مصفوفات من الكائنات (تحافظ على العلاقات) |
geo_point |
إحداثيات خط العرض/الطول |
المحللات المخصصة
لإنشاء محلل نص مخصص (مثال: للإكمال التلقائي):
{
"settings": {
"analysis": {
"analyzer": {
"autocomplete": {
"type": "custom",
"tokenizer": "standard",
"filter": ["lowercase", "autocomplete_filter"]
}
},
"filter": {
"autocomplete_filter": {
"type": "edge_ngram",
"min_gram": 2,
"max_gram": 20
}
}
}
},
"mappings": {
"properties": {
"name": {
"type": "text",
"analyzer": "autocomplete",
"search_analyzer": "standard"
}
}
}
}
إدارة الكتلة
صحة الكتلة
curl -X GET "http://localhost:9200/_cluster/health"
استجابة نموذجية:
{
"cluster_name": "elasticsearch",
"status": "green",
"number_of_nodes": 3,
"active_primary_shards": 25
}
الحالات:
- أخضر: جميع الأجزاء مخصصة
- أصفر: نسخ متماثلة غير مخصصة (عادة عند وجود عقدة واحدة)
- أحمر: أجزاء أساسية مفقودة
إحصائيات الفهرس
curl -X GET "http://localhost:9200/_cat/indices?v"
إحصائيات العقدة
curl -X GET "http://localhost:9200/_nodes/stats"
مسح ذاكرة التخزين المؤقت
curl -X POST "http://localhost:9200/_cache/clear"
الاختبار باستخدام Apidog
استعلامات Elasticsearch قد تصبح معقدة. استخدم Apidog لاختبارها وضمان صحتها.
1. حفظ الاستعلامات الشائعة
يمكنك تخزين قوالب البحث في Apidog مع متغيرات ديناميكية:
{
"query": {
"bool": {
"must": [
{ "match": { "{{search_field}}": "{{search_term}}" } }
],
"filter": [
{ "range": { "{{price_field}}": { "lte": "{{max_price}}" } } }
]
}
}
}
2. التحقق من صحة الاستجابات
أضف اختبارات تلقائية لضمان صحة البيانات:
pm.test('Search returns results', () => {
const response = pm.response.json()
pm.expect(response.hits.total.value).to.be.above(0)
})
pm.test('Aggregations present', () => {
const response = pm.response.json()
pm.expect(response.aggregations).to.exist
})
3. فصل البيئات
اضبط متغيرات البيئة لتسهيل التنقل بين بيئات التطوير والإنتاج:
# Local
ES_HOST: http://localhost:9200
ES_USER: elastic
ES_PASSWORD: your_password
# Production
ES_HOST: https://search.yourcompany.com
ES_API_KEY: prod_api_key
اختبر واجهات برمجة تطبيقات Elasticsearch باستخدام Apidog - مجانًا
الأخطاء الشائعة والإصلاحات
403 ممنوع (Forbidden)
السبب: فشل المصادقة أو أذونات غير كافية.
الإصلاح: تحقق من بيانات الاعتماد أو الأذونات لمفتاح الـ API.
404 index_not_found_exception (فهرس غير موجود)
السبب: الفهرس غير موجود.
الإصلاح: أنشئ الفهرس أولاً أو فعّل الإنشاء التلقائي (غير موصى به للإنتاج).
circuit_breaking_exception
السبب: الاستعلام يستهلك ذاكرة مرتفعة.
الإصلاح: قلّل قيمة size، بسّط الاستعلامات، وأضف عوامل تصفية.
search_phase_execution_exception
السبب: خطأ في بناء جملة الاستعلام.
الإصلاح: راجع JSON بعناية (علامات اقتباس، مسارات حقول صحيحة).
البدائل والمقارنات
| الميزة | Elasticsearch | OpenSearch | Meilisearch | Typesense |
|---|---|---|---|---|
| الإعداد | مستضاف ذاتيًا | مستضاف ذاتيًا | ملف تنفيذي واحد | ملف تنفيذي واحد |
| جودة البحث | ممتازة | جيدة | ممتازة | جيدة |
| منحنى التعلم | صعب | صعب | سهل | سهل |
| قابلية التوسع | ممتازة | ممتازة | جيدة | جيدة |
| عرض السحابة | Elastic Cloud | OpenSearch Serverless | Meilisearch Cloud | Typesense Cloud |
Elasticsearch يمتلك أغلب الميزات وأكبر مجتمع. Meilisearch وTypesense أبسط للبحث الأساسي.
حالات الاستخدام في العالم الحقيقي
البحث في التجارة الإلكترونية: متجر يضم 100,000 منتج، يدعم البحث بالاسم والوصف والفئة والسعر، مع إكمال تلقائي وتصفية النتائج.
سجلات التطبيق: شحن السجلات إلى Elasticsearch عبر Filebeat، والبحث فيها حسب الخدمة والخطورة والزمن، مع لوحات معلومات للأخطاء والأداء.
تحليلات الأمان: فهرسة وتحليل سجلات الشبكة، البحث عن عناوين IP مشبوهة، ومراقبة الأنماط وتنبيه الحالات غير الطبيعية باستخدام التجميعات.
ختامًا
تعلمت في هذا الدليل:
- فهرسة المستندات بصيغة JSON
- الاستعلام باستخدام لغة استعلام Elasticsearch (DSL)
- استخدام التجميعات للتحليلات
- تكوين التعيينات للبحث الأمثل
- مراقبة صحة الكتلة
خطواتك التالية:
- شغّل Elasticsearch محليًا
- أنشئ فهرسًا مع التعيينات المطلوبة
- فهرس مستندات تجريبية
- اكتب استعلامات بحث
- جرّب التجميعات
اختبر واجهات برمجة تطبيقات Elasticsearch باستخدام Apidog - مجانًا
الأسئلة الشائعة
ما الفرق بين Elasticsearch و Solr؟
كلاهما محركات بحث مبنية على Lucene، لكن Elasticsearch يتميز بتوزيع أفضل وواجهات API أسهل. Solr يحتوي على ميزات مؤسساتية أكثر. غالبية المشاريع الجديدة تفضل Elasticsearch.
كيف أتعامل مع الأحرف الخاصة في البحث؟
استخدم الشرطة المائلة للخلف للهروب من الأحرف الخاصة: ()[]{}:^\"\+-!~*?| أو استخدم simple_query_string الأكثر مرونة.
ما هو الجزء (shard)؟
الجزء هو قسم من الفهرس، كل واحد هو فهرس Lucene مستقل. هناك أجزاء أساسية للكتابة وأجزاء منسوخة للقراءة وتحمل الخطأ.
كم عدد الأجزاء التي يجب إنشاؤها؟
قاعدة عامة: 20-50 جيجابايت لكل جزء. ابدأ بجزء أساسي واحد وأضف نسخًا متماثلة، وزد الأجزاء الأساسية فقط إذا استدعى الأمر.
هل يمكن تغيير التعيينات بعد الفهرسة؟
يمكنك إضافة حقول جديدة، لكن لتغيير نوع حقل موجود، يجب إعادة فهرسة البيانات. استخدم قوالب الفهرسة لإدارة التعيينات.
ما هو معامل _routing؟
يحدد إلى أي جزء يُكتب المستند استنادًا إلى قيمة حقل. الافتراضي هو _id. استخدمه إذا كانت الاستعلامات دائمًا تُصفى على حقل معين (مثلاً user_id) لتحسين الأداء.
كيف أتعامل مع البيانات الزمنية؟
استخدم فهارس حسب التاريخ مثل logs-2026.03.24، ما يسمح بحذف البيانات القديمة ويحسن أداء الاستعلامات الزمنية.

Top comments (0)