Elasticsearch 客户端 for Rust:elasticsearch-rs 库概览

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

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

开始课程

Elasticsearch 客户端 for Rust:elasticsearch-rs



Elasticsearch 是一个基于 Apache Lucene 构建的强大分布式搜索与分析系统。为了从 Rust 应用程序中与其交互,官方提供了 elasticsearch-rs 客户端。该库提供了一套完整的工具,用于操作 Elasticsearch 的 REST API,包括索引、搜索、聚合以及集群管理。本文将详细介绍 elasticsearch-rs 的安装、配置和主要功能,并附有代码示例。



什么是 elasticsearch-rs?

elasticsearch-rs 是 Elastic 公司为 Rust 语言开发的官方异步 Elasticsearch 客户端。它基于流行的异步 HTTP 客户端库 reqwest,并为所有 Elasticsearch 端点提供了类型安全的 API。主要优势包括:

  • 全面支持 Elasticsearch 7.x 和 8.x —— 涵盖所有核心操作:CRUD、搜索、聚合、索引管理。
  • 异步支持 —— 使用 async/await,能够高效处理大量请求。
  • 类型安全 —— 请求和响应结构体严格类型化,减少运行时错误。
  • 自动序列化/反序列化 —— 通过 serde 和 serde_json 实现。
  • 身份验证支持 —— 支持 Basic Auth、API 密钥、SSL/TLS。


安装

在 Cargo.toml 中添加依赖:

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


基本连接

创建一个连接到本地 Elasticsearch 实例的客户端:

use elasticsearch::Elasticsearch;use elasticsearch::http::transport::Transport;use serde_json::json;

#[tokio::main]async fn main() -> Result<(), Box<dyn std::error::Error>> { let transport = Transport::single_node("http://localhost:9200")?; let client = Elasticsearch::new(transport); // 检查连接 let response = client.ping().send().await?; println!("Elasticsearch 可用: {}", response.status_code()); Ok(())}


基本操作:CRUD



1. 索引文档

向 books 索引中添加一个图书文档:

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

let book = Book { title: "Rust 实战".into(), author: "蒂姆·麦克纳马拉".into(), year: 2023, isbn: "978-5-4461-2345-6".into(),};

let response = client .index(IndexParts::IndexId("books", "1")) .body(json!(book)) .send() .await?;

println!("文档已索引: {:?}", response.body());


2. 获取文档

let response = client    .get(GetParts::IndexId("books", "1"))    .send()    .await?;

if response.status_code().is_success() { let book: Book = response.json().await?; println!("找到文档: {:?}", book);}


3. 更新文档

let response = client    .update(UpdateParts::IndexId("books", "1"))    .body(json!({        "doc": { "year": 2024 }    }))    .send()    .await?;

println!("已更新: {:?}", response.body());


4. 删除文档

let response = client    .delete(DeleteParts::IndexId("books", "1"))    .send()    .await?;

println!("已删除: {:?}", response.body());


使用 Query DSL 进行搜索

对 title 字段执行全文搜索:

use elasticsearch::SearchParts;

l

推荐