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