عميل Elasticsearch للغة Rust: المكتبة الرسمية elasticsearch-rs

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

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

ابدأ الدورة

عميل Elasticsearch للغة Rust: elasticsearch-rs



elasticsearch-rs هو عميل غير متزامن رسمي للتفاعل مع Elasticsearch من نظام Rust البيئي. توفر المكتبة مجموعة كاملة من الأدوات للعمل مع محرك البحث: من عمليات CRUD البسيطة إلى التجميعات المعقدة واستعلامات bulk. يتم تطويرها وصيانتها بواسطة فريق Elastic، مما يضمن حداثة API والتوافق مع أحدث إصدارات Elasticsearch.



الإمكانيات الرئيسية



  • دعم كامل لـ Elasticsearch API — الفهرسة، البحث، التجميعات، إدارة الفهارس، التعيين (mapping) وإعدادات الكتلة.
  • عدم التزامن — مبنية على tokio و reqwest، مما يسمح بمعالجة آلاف الطلبات دون حظر الخيوط.
  • أمان الأنواع — جميع الطلبات والاستجابات مقيدة بشكل صارم بالأنواع، ويتم اكتشاف أخطاء التحقق في مرحلة الترجمة.
  • دعم عمليات bulk — تحميل وتحديث المستندات بشكل جماعي مع معالجة تلقائية للأخطاء.
  • SSL/TLS والمصادقة — دعم مدمج لـ HTTPS، المصادقة الأساسية (Basic Auth)، مفاتيح API والرموز المميزة.
  • التسلسل عبر serde — يتم تحويل المستندات تلقائياً من/إلى JSON باستخدام crate serde.


التثبيت والإعداد



أضف التبعية في Cargo.toml:



[dependencies]elasticsearch = "8.14.0"serde = { version = "1.0", features = ["derive"] }serde_json = "1.0"tokio = { version = "1.0", features = ["full"] }


اتصال أساسي بنسخة محلية من Elasticsearch:



use elasticsearch::{Elasticsearch, Error};use url::Url;

#[tokio::main]async fn main() -> Result<(), Error> { let client = Elasticsearch::new( elasticsearch::http::transport::Transport::single_node( Url::parse("http://localhost:9200")? )? ); // التحقق من الاتصال let response = client.ping().send().await?; println!("Elasticsearch متاح: {}", response.status_code()); Ok(())}


العمل مع المستندات



فهرسة مستند



تعريف هيكل للتسلسل:



use serde::{Serialize, Deserialize};

#[derive(Debug, Serialize, Deserialize)]struct Book { title: String, author: String, year: u16, isbn: String,}


فهرسة مستند جديد:



use elasticsearch::{IndexParts, SearchParts};use serde_json::json;

async fn index_book(client: &Elasticsearch, book: &Book) -> Result<(), Error> { let response = client .index(IndexParts::IndexId("books", &book.isbn)) .body(book) .send() .await?; println!("تم فهرسة المستند: {:?}", response); Ok(())}


البحث في الفهرس



مثال على البحث النصي الكامل:



async fn search_books(client: &Elasticsearch, query: &str) -> Result, Error> {    let response = client        .search(SearchParts::Index(&["books"]))        .body(json!({            "query": {                "multi_match": {                    "query": query,                    "fields": ["title^2", "author"]                }            }        }))        .send()        .await?;        let response_body = response.json::().await?;    let hits = response_body["hits"]["hits"]        .as_array()        .unwrap_or(&vec![]);        let books: Vec = hits        .iter()        .filter_map(|hit| {            let source = hit["_source"].clone();            serde_json::from_value(source).ok()        })        .collect();        Ok(books)}


عمليات bulk للتحميل الجماعي



تحميل آلاف المستندات بكفاءة:



use elasticsear                    

توصيات