عميل Elasticsearch لـ C# (.NET): NEST و Elastic.Clients.Elasticsearch
\n\nElasticsearch هو نظام بحث وتحليل موزع قوي يُستخدم على نطاق واسع للبحث النصي الكامل، وتسجيل السجلات، والمراقبة، وتحليل البيانات. للعمل مع Elasticsearch من تطبيقات C# (.NET)، يوجد عميلان رسميان رئيسيان: NEST (عالي المستوى، مع واجهة fluent API) و Elastic.Clients.Elasticsearch (جديد، منخفض المستوى، ظهر مع الإصدار 8.x). في هذه المقالة، سنستعرض كلا النهجين بالتفصيل، بالإضافة إلى التثبيت، والعمليات الأساسية، وأمثلة الكود.
\n\n1. ما هو عميل Elasticsearch لـ .NET؟
\n\nيوفر Elasticsearch واجهة RESTful API، لكن العمل المباشر مع طلبات HTTP في C# غير مريح. يحل العملاء الرسميون هذه المشكلة:
\n- \n
- NEST — عميل قديم لكنه موثوق وعالي المستوى. يوفر استعلامات مقيدة بشدة، وربط فئات POCO، وواجهة fluent. يُوصى به للمشاريع على .NET Framework و .NET Core 3.1. \n
- Elastic.Clients.Elasticsearch — عميل جديد (بدءًا من Elasticsearch 8.x). خفيف الوزن، غير متزامن، ويدعم .NET 6+. يستخدم System.Text.Json ولا يتطلب تبعيات إضافية. \n
2. تثبيت المكتبات
\n\nيتم التثبيت عبر NuGet. لـ NEST:
\ndotnet add package NEST\nللعميل الجديد:
\ndotnet add package Elastic.Clients.Elasticsearch\n\n3. الاتصال بـ Elasticsearch
\n\nمثال على الاتصال باستخدام NEST:
\nvar settings = new ConnectionSettings(new Uri("http://localhost:9200"))\n .DefaultIndex("my_index");\nvar client = new ElasticClient(settings);\n\nمثال على الاتصال باستخدام Elastic.Clients.Elasticsearch:
\nvar settings = new ElasticsearchClientSettings(new Uri("http://localhost:9200"));\nvar client = new ElasticsearchClient(settings);\n\n4. تعريف نموذج البيانات
\n\nللعمل مع المستندات، سننشئ فئة POCO:
\npublic class Product\n{\n public int Id { get; set; }\n public string Name { get; set; }\n public string Description { get; set; }\n public decimal Price { get; set; }\n public DateTime CreatedAt { get; set; }\n}\n\n5. عمليات CRUD (إنشاء، قراءة، تحديث، حذف)
\n\n5.1. فهرسة المستند (إنشاء/تحديث)
\nNEST:
\nvar product = new Product { Id = 1, Name = "لابتوب", Price = 75000 };\nvar response = await client.IndexAsync(product, idx => idx.Index("products"));\n\nElastic.Clients.Elasticsearch:
\nvar product = new Product { Id = 1, Name = "لابتوب", Price = 75000 };\nvar response = await client.IndexAsync(product, "products", 1);\n\n5.2. الحصول على مستند بواسطة المعرف
\nNEST:
\nvar response = await client.GetAsync<Product>(1, g => g.Index("products"));\nvar product = response.Source;\n\nElastic.Clients.Elasticsearch:
\nvar response = await client.GetAsync<Product>("products", 1);\nvar product = response.Source;\n\n5.3. تحديث المستند
\nNEST:
\nvar response = await client.UpdateAsync<Product>(1, u => u\n .Index("products")\n .Doc(new Product { Name = "لابتوب HP", Price = 80000 }));\n\nElastic.Clients.Elasticsearch:
\nvar response = await client.UpdateAsync<Product>("products", 1, u => u\n .Doc(new Product { Name = "لابتوب HP", Price = 80000 }));\n\n5.4. حذف المستند
\nNEST:
\nvar response = await client.DeleteAsync<Product>(1, d => d.Index("products"));\n\nElastic.Clients.Elasticsearch: