English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

اتفاقيات API لـ Elasticsearch

واجهة برمجة التطبيقات (API) في الويب هي مجموعة من الاستدعاءات أو الأوامر البرمجية، تستخدم للاستفادة من مكونات البرمجيات الخاصة بتلك التطبيق على الويب. على سبيل المثال، تساعد واجهة برمجة API لـ Facebook المطورين في إنشاء التطبيقات عبر الوصول إلى البيانات أو الوظائف من Facebook؛ يمكن أن تكون تاريخ الميلاد أو تحديث الحالة.

يقدم Elasticsearch واجهة API REST، يمكن الوصول إلى هذه الواجهة عبر HTTP. يستخدم Elasticsearch بعض المبادئ التوجيهية، وسنناقشها الآن.

Multiple indices

Most operations in the API, mainly searches and other operations, are for one or more indices. This helps users to search in multiple locations or all available data with just one query. Many different symbols are used to perform operations in multiple indices. We will discuss some of them in this chapter.

Comma-separated symbols

POST /index1,index2,index3/_search

نص الطلب

{
   "query":{
      "query_string":{
         "query":"any_string"
      }
   }
}

الاستجابة

JSON objects from index1, index2, index3 that contain "any_string".

_all All indices keywords

POST /_all/_search

نص الطلب

{
   "query":{
      "query_string":{
         "query":"any_string"
      }
   }
}

الاستجابة

JSON objects from all indices that contain "any_string".

Wildcards (*, +, –)

POST /school*/_search

نص الطلب

{
   "query":{
      "query_string":{
         "query":"CBSE"
      }
   }
}

الاستجابة

JSON objects from all indices that start with schools that contain CBSE.

بالإضافة إلى ذلك، يمكنك أيضًا استخدام الشيفرة التالية-

POST /school*,-schools_gov /_search

نص الطلب

{
   "query":{
      "query_string":{
         "query":"CBSE"
      }
   }
}

الاستجابة

JSON objects from all indices that start with "school" but not from "school_gov" and contain CBSE.

هناك بعض معاملات سلسلة URL-

  • ignore_unavailable−إذا لم يكن هناك فهرس أو أكثر في URL لـ index(es)، لن يحدث خطأ أو سيتوقف أي عملية. على سبيل المثال، يوجد فهرس school، لكن book_shops لا يوجد.

POST /school*,book_shops/_search

نص الطلب

{
   "query":{
      "query_string":{
         "query":"CBSE"
      }
   }
}

نص الطلب

{
   "error":{
      "root_cause":[{
         "type":"index_not_found_exception", "reason":"no such index",
         "resource.type":"index_or_alias", "resource.id":"book_shops",
         "index":"book_shops"
      }],
      "type":"index_not_found_exception", "reason":"no such index",
      "resource.type":"index_or_alias", "resource.id":"book_shops",
      "index":"book_shops"
   },"status":404
}

اعلم ببعض الكود التالي-

POST /school*,book_shops/_search?ignore_unavailable = true

نص الطلب

{
   "query":{
      "query_string":{
         "query":"CBSE"
      }
   }
}

الاستجابة (بدون أخطاء)

JSON objects from all indices that start with schools that contain CBSE.

allow_no_indices

trueإذا لم يكن لديه فهرس URL يحتوي على Wildcard، فإن قيمة هذا المعامل ستمنع الخطأ. على سبيل المثال، لا يوجد فهرس يبدأ بـ schools_pri-

POST /schools_pri*/_search?allow_no_indices = true

نص الطلب

{
   "query":{
      "match_all":{}
   }
}

الاستجابة (بدون أخطاء)

{
   "took":1,"timed_out": false, "_shards":{"total":0, "successful":0, "failed":0},
   "hits":{"total":0, "max_score":0.0, "hits":[]}
}

expand_wildcards

يحدد هذا المعامل ما إذا كان يجب توسيع العلامة المزدوجة أو الفاصلة العريضة إلى فترات زمنية مفتوحة أو مغلقة أو تنفيذ كلاهما في نفس الوقت. يمكن أن يكون هذا المعامل قائمًا أو مغلقًا أو لا يوجد له قيمة.

على سبيل المثال، إغلاق فترات الزمنية المدرسية-

POST /schools/_close

الاستجابة

{"acknowledged":true}

اعلم ببعض الكود التالي-

POST /school*/_search?expand_wildcards = closed

نص الطلب

{
   "query":{
      "match_all":{}
   }
}

الاستجابة

{
   "error":{
      "root_cause":[{
         "type":"index_closed_exception", "reason":"closed", "index":"schools"
      }],
      "type":"index_closed_exception", "reason":"closed", "index":"schools"
   }, "status":403
}

دعم التاريخ الرياضي في اسم الفترات الزمنية

يقدم Elasticsearch وظيفة البحث في الفترات الزمنية بناءً على التاريخ والوقت. يجب تحديد التاريخ والوقت بتنسيق معين. على سبيل المثال، إذا كان اسم الفترات الزمنية هو accountdetail-2015.12.30، فإن الفترات الزمنية ستخزن تفاصيل حساب البنك في 30 ديسمبر 2015. يمكن تنفيذ العمليات الرياضية للحصول على تفاصيل التاريخ أو فترة التاريخ والوقت المحددة.

تنسيق اسم الفترات الزمنية الرياضية

<static_name{date_math_expr{date_format|time_zone}}>
/<accountdetail-{now-2d{YYYY.MM.dd|utc}}>/_search

static_name هو جزء من التعبير، ويبقى ثابتًا في كل مكانة رياضية للفترة الزمنية (مثل تفاصيل العملاء) في كل تاريخ. يحتوي date_math_expr على تعبير رياضي، ويحدد التاريخ والوقت بشكل ديناميكي مثل now-2d. يحتوي date_format على تنسيق للكتابة في الفترات الزمنية مثل YYYY.MM.dd في الفترات الزمنية. إذا كان اليوم هو 30 ديسمبر 2015، فإن <accountdetail- {now-2d {YYYY.MM.dd}}> سيقوم بإرجاع accountdetail-2015.12.28.

تعبيرتحويل إلى
<accountdetail-{now-d}>accountdetail-2015.12.29
<accountdetail-{now-M}>accountdetail-2015.11.30
<accountdetail-{now{YYYY.MM}}>accountdetail-2015.12

الآن، سنرى بعض الخيارات الشائعة التي يقدمها Elasticsearch التي يمكن استخدامها للحصول على إجابات بتنسيق معين.

النتيجة المزخرفة

يمكننا الحصول على استجابة بتنسيق جيد من JSON عبر إضافة معامل استعلام URL (أي pretty = true).

POST /schools/_search?pretty = true

نص الطلب

{
   "query":{
      "match_all":{}
   }
}

الاستجابة

……………………..
{
   "_index": "schools","_type": "school","_id": "1","_score": 1.0,
   "_source":{
      "name":"Central School","description":"CBSE Affiliation",
      "street":"Nagan","city":"paprola","state":"HP","zip":"176115",
      "location": [31.8955385, 76.8380405],"fees":2000,
      "tags":["Senior Secondary","beautiful campus"],"rating":"3.5"
   }
}
………………….

الإخراج القابل للقراءة من قبل البشر

هذا الخيار يمكنه تحويل إجابات الإحصاء إلى شكل يمكن قراءته من قبل البشر (إذا كان human = true) أو شكل يمكن قراءته من قبل الحاسوب (إذا كان human = false). على سبيل المثال، إذا كان human = true، فإن distance_kilometer = 20KM؛ وإذا كان human = false، فإن distance_meter = 20000، وفي هذه الحالة يجب على برنامج الحاسوب الآلي استخدام الإجابة.

تصفية الاستجابة

من خلال إضافة إحداهما إلى معامل field_path، يمكننا تصفية الاستجابات لعدد قليل من الحقول. على سبيل المثال،

POST /schools/_search?filter_path = hits.total

نص الطلب

{
   "query":{
      "match_all":{}
   }
}

الاستجابة

{"hits":{"total":3}}