عميل 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