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