عميل Elasticsearch للغة Go (Golang): دليل شامل

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

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

ابدأ الدورة

عميل Elasticsearch للغة Go (Golang): أداة قوية للعمل مع محرك البحث



Elasticsearch هو نظام بحث موزع ونص كامل مبني على Apache Lucene. للتفاعل الفعال معه من تطبيقات Go (Golang)، يتم استخدام العميل الرسمي go-elasticsearch. توفر هذه المكتبة واجهة برمجة تطبيقات (API) مريحة وعالية الأداء لتنفيذ جميع العمليات الأساسية: من فهرسة المستندات إلى الاستعلامات التحليلية المعقدة.



في هذه المقالة، سنقوم بتحليل إمكانيات المكتبة بالتفصيل، وكيفية تثبيتها وإعدادها، وسنقدم أمثلة عملية على الكود بلغة Go.



الإمكانيات الرئيسية لـ go-elasticsearch



  • دعم كامل لـ REST API الخاص بـ Elasticsearch — العمل مع الفهارس والمستندات والبحث والتجميعات وإدارة المجموعة.
  • استعلامات آمنة من حيث النوع — استخدام هياكل Go لبناء استعلامات JSON.
  • إدارة تلقائية للاتصالات — تجمع الاتصالات، إعادة المحاولة عند الأخطاء، موازنة التحميل.
  • دعم عمليات bulk — فهرسة وتحديث جماعي للمستندات.
  • التكامل مع سياقات Go — إلغاء الاستعلامات وتعيين المهلات الزمنية.
  • إعداد سهل — عملاء HTTP مخصصون، تسجيل، ضغط.


التثبيت



لتثبيت المكتبة، قم بتنفيذ الأمر التالي في الطرفية:



go get github.com/elastic/go-elasticsearch/v8


تأكد من أن إصدار Go لديك لا يقل عن 1.18. إذا كنت تستخدم إصدارًا أقدم من Elasticsearch (مثل 7.x)، قم بتثبيت الإصدار المقابل من العميل:



go get github.com/elastic/go-elasticsearch/v7


الاتصال الأساسي والإعداد



للبدء، قم بإنشاء عميل مع تحديد عنوان خادم Elasticsearch:



package main

import ( "log" "github.com/elastic/go-elasticsearch/v8")

func main() { cfg := elasticsearch.Config{ Addresses: []string{ "http://localhost:9200", }, // إذا كانت المصادقة مطلوبة: // Username: "elastic", // Password: "changeme", }

es, err := elasticsearch.NewClient(cfg) if err != nil { log.Fatalf("خطأ في إنشاء العميل: %s", err) }

// التحقق من الاتصال res, err := es.Info() if err != nil { log.Fatalf("خطأ في الحصول على المعلومات: %s", err) } defer res.Body.Close()

log.Println(res.String())}


فهرسة المستندات



لإضافة مستند إلى الفهرس، يتم استخدام الطريقة Index() أو Create(). لنلقِ نظرة على مثال مع بيانات محددة النوع:



type Article struct {    ID      int      `json:"id"`    Title   string   `json:"title"`    Content string   `json:"content"`    Tags    []string `json:"tags"`    Date    string   `json:"date"`}

func indexArticle(es *elasticsearch.Client, article Article) error { body, err := json.Marshal(article) if err != nil { return err }

req := esapi.IndexRequest{ Index: "articles", DocumentID: strconv.Itoa(article.ID), Body: strings.NewReader(string(body)), Refresh: "true", // للتحديث الفوري }

res, err := req.Do(context.Background(), es) if err != nil { return err } defer res.Body.Close()

if res.IsError() { return fmt.Errorf("خطأ في الفهرسة: %s", res.String()) }

return nil}


البحث عن المستندات



لتنفيذ استعلامات البحث، يتم استخدام الطريقة Search(). مثال على البحث النصي الكامل:



func searchArticles(es *elasticsearch.Client, query string) ([]Article, error) {    var buf bytes.Buffer    searchQuery := map[string]interface{}{        "quer                    

توصيات