Elasticsearch 的 Rust 客户端:官方库 elasticsearch-rs

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Elasticsearch 的 Rust 客户端:elasticsearch-rs



elasticsearch-rs 是用于从 Rust 生态系统与 Elasticsearch 进行交互的官方异步客户端。该库提供了与搜索引擎交互的完整工具集:从简单的 CRUD 操作到复杂的聚合和批量请求。由 Elastic 团队开发并维护,保证了 API 的时效性以及与最新版本 Elasticsearch 的兼容性。



关键特性



  • 全面支持 Elasticsearch API — 索引、搜索、聚合、索引管理、映射和集群设置。
  • 异步 — 基于 tokio 和 reqwest 构建,能够在不阻塞线程的情况下处理数千个请求。
  • 类型安全 — 所有请求和响应都经过严格类型化,验证错误在编译阶段即可捕获。
  • 支持批量操作 — 批量加载和更新文档,并自动处理错误。
  • SSL/TLS 和身份验证 — 内置支持 HTTPS、基本认证、API 密钥和令牌。
  • 通过 serde 进行序列化 — 文档通过 serde crate 自动与 JSON 进行相互转换。


安装与配置



在 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)}


用于批量加载的批量操作



高效加载数千个文档:



use elasticsear                    

推荐