عميل Elasticsearch لـ Kotlin: التكامل، الأمثلة والإمكانيات

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

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

ابدأ الدورة

عميل Elasticsearch لـ Kotlin: دليل شامل

\n\n

Elasticsearch هو نظام بحث موزع قوي يعتمد على Lucene. للعمل معه من تطبيقات Kotlin، يُستخدم العميل الرسمي Elasticsearch Java Client، المتوافق تمامًا مع Kotlin نظرًا لقربه من JVM. في هذه المقالة، سنشرح كيفية إعداد العميل، تنفيذ العمليات الأساسية (الفهرسة، البحث، الحذف) واستخدام الإمكانيات المتقدمة مثل التجميعات والتصفية.

\n\n

الاتصال والإعداد

\n\n

للبدء، أضف التبعية في ملف build.gradle.kts (أو build.gradle):

\n\n
// build.gradle.kts\ndependencies {\n    implementation("co.elastic.clients:elasticsearch-java:8.15.0")\n    implementation("com.fasterxml.jackson.core:jackson-databind:2.17.0")\n    implementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.17.0")\n}
\n\n

ثم قم بإنشاء العميل:

\n\n
import co.elastic.clients.elasticsearch.ElasticsearchClient\nimport co.elastic.clients.json.jackson.JacksonJsonpMapper\nimport co.elastic.clients.transport.rest_client.RestClientTransport\nimport org.apache.http.HttpHost\nimport org.elasticsearch.client.RestClient\n\nfun createClient(): ElasticsearchClient {\n    val restClient = RestClient.builder(\n        HttpHost("localhost", 9200, "http")\n    ).build()\n\n    val transport = RestClientTransport(restClient, JacksonJsonpMapper())\n    return ElasticsearchClient(transport)\n}\n\nval client = createClient()
\n\n

العمليات الأساسية

\n\n

فهرسة مستند

\n\n

أنشئ data class لتمثيل البيانات:

\n\n
data class Product(\n    val id: String,\n    val name: String,\n    val price: Double,\n    val category: String\n)
\n\n

يتم تنفيذ الفهرسة كالتالي:

\n\n
suspend fun indexProduct(product: Product) {\n    client.index { i ->\n        i.index("products")\n            .id(product.id)\n            .document(product)\n    }\n}\n\n// مثال على الاستدعاء\nval product = Product("1", "لابتوب", 999.99, "إلكترونيات")\nrunBlocking { indexProduct(product) }
\n\n

البحث حسب الحقول

\n\n
suspend fun searchByName(name: String): List<Product> {\n    val response = client.search<Product>({ s ->\n        s.index("products")\n            .query { q ->\n                q.match { m ->\n                    m.field("name")\n                        .query(name)\n                }\n            }\n    }, Product::class.java)\n\n    return response.hits().hits().map { it.source()!! }\n}
\n\n

حذف مستند

\n\n
suspend fun deleteProduct(id: String) {\n    client.delete { d ->\n        d.index("products")\n            .id(id)\n    }\n}
\n\n

التصفية والتجميعات

\n\n

يدعم Elasticsearch الاستعلامات المعقدة. على سبيل المثال، البحث عن المنتجات ضمن نطاق سعري مع تجميع حسب الفئات:

\n\n
suspend fun searchWithAggregation(minPrice: Double, maxPrice: Double) {\n    val response = client.search<Product>({ s ->\n        s.index("products")\n            .query { q ->\n                q.range { r ->\n                    r.field("price")\n                        .gte(minPrice.toString())\n                        .lte(maxPrice.toString())\n                }\n            }\n            .aggregations("by_category") { a ->\n                a.terms { t ->\n                    t.field("category")\n                }\n            }\n    }, Product::class.java)\n\n    // الحصول على نتائج التجميع\n    val categories = response.aggregations()\n        ?.get("by_category")\n        ?.sterms()\n        ?.buckets()\n        ?.map { "${it.key()}: ${it.docCount()}" }\n        ?: emptyList()\n\n    println("الفئات: $categories")\n}
\n\n

المعالجة المجمعة (Bulk API)

\n\n

للفهرسة الجماعية، استخدم bulk

توصيات