官方 Elasticsearch Rust 客户端
Official Rust Client for Elasticsearch.
Full documentation is available at https://docs.rs/elasticsearch
The project is still very much a work in progress and in an alpha state; input and contributions welcome!
The Elasticsearch Rust client is forward compatible; meaning that the client supports communicating with greater minor versions of Elasticsearch. Elasticsearch language clients are also backwards compatible with lesser supported minor Elasticsearch versions.
The following are a list of Cargo features that can be enabled or disabled:
native-tls.rustls.beta-apis.Additionally, this library also runs in Web Assembly runtimes that provide the Fetch API, like node.js and web browsers.
The client exposes all Elasticsearch APIs as associated functions, either on
the root client, Elasticsearch, or on one of the namespaced clients, such as Cat, Indices, etc. The namespaced clients
are based on the grouping of APIs within the Elasticsearch REST API specs from which much of the client is generated.
All API functions are async only, and can be awaited.
Add elasticsearch crate and version to Cargo.toml. Choose the version
that is compatible with the version of Elasticsearch you're using
[dependencies]
elasticsearch = "9.1.0-alpha.1"
The following optional dependencies may also be useful to create requests and read responses
serde = "~1"
serde_json = "~1"
The client uses reqwest to make HTTP calls, which internally uses
the tokio runtime for async support. As such, you may require to take a dependency on tokio
in order to use the client. For example, in Cargo.toml, you may need the following dependency,
tokio = { version = "*", features = ["full"] }
and to attribute async main function with #[tokio::main]
#[tokio::main]
async fn main() -> Result> {
// your code ...
Ok(())
}
and attribute test functions with #[tokio::test]
#[tokio::test]
async fn my_test() -> Result> {
// your code ...
Ok(())
}
Build a transport to make API requests to Elasticsearch using the TransportBuilder,
which allows setting of proxies, authentication schemes, certificate validation, and
other transport related settings.
To create a client to make API calls to Elasticsearch running on https://localhost:9200
use elasticsearch::Elasticsearch;
fn main() {
let client = Elasticsearch::default();
}
Alternatively, you can create a client to make API calls against Elasticsearch running on a specific url
use elasticsearch::{
Elasticsearch, Error,
http::transport::Transport
};
fn main() -> Result {
let transport = Transport::single_node("https://example.com")?;
let client = Elasticsearch::new(transport);
Ok(())
}
If you're running against an Elasticsearch deployment in Elastic Cloud, a client can be created using a Cloud ID and credentials retrieved from the Cloud web console
use elasticsearch::{
auth::Credentials,
Elasticsearch, Error,
http::transport::Transport,
};
fn main() -> Result {
let cloud_id = "cluster_name:Y2xvdWQtZW5kcG9pbnQuZXhhbXBsZSQzZGFkZjgyM2YwNTM4ODQ5N2VhNjg0MjM2ZDkxOGExYQ==";
// can use other types of Credentials too, like Bearer or ApiKey
let credentials = Credentials::Basic("".into(), "".into());
let transport = Transport::cloud(cloud_id, credentials)?;
let client = Elasticsearch::new(transport);
Ok(())
}
More control over how a Transport is built can be
achieved using TransportBuilder to build a transport, and
passing it to Elasticsearch::new() create a new instance of Elasticsearch
use url::Url;
use elasticsearch::{
Error, Elasticsearch,
http::transport::{TransportBuilder,SingleNodeConnectionPool},
};
fn main() -> Result {
let url = Url::parse("https://example.com")?;
let conn_pool = SingleNodeConnectionPool::new(url);
let transport = TransportBuilder::new(conn_pool).disable_proxy().build()?;
let client = Elasticsearch::new(transport);
Ok(())
}
You can also configure the list of nodes of an Elasticsearch cluster using the MultiNodeConnectionPool, and the client will do a round-robin load balancing among those nodes. It can also periodically re-seed the list of nodes by querying the cluster.
The following will execute a POST request to /_search?allow_no_indices=true with
a JSON body of {"query":{"match_all":{}}}
…
The client provides functions on each API builder struct for all query string parameters available for that API. APIs with multiple URI path variants, where some can contain parts parameters, are modelled as enums.
Elasticsearch also has an async send function on the root that allows sending an
API call to an endpoint not represented as an API function, for example, experimental
and beta APIs
use elasticsearch::{http::Method, Elasticsearch, Error, SearchParts};
use http::HeaderMap;
use serde_json::Value;
#[tokio::main]
async fn main() -> Result> {
let client = Elasticsearch::default();
let body = b"{\"query\":{\"match_all\":{}}}";
let response = client
.send(
Method::Post,
SearchParts::Index(&["tweets"]).url().as_ref(),
HeaderMap::new(),
Option::::None,
Some(body.as_ref()),
None,
)
.await?;
Ok(())
}
This is free software, licensed under The Apache License Version 2.0..
暂无开放 Issues,或尚未同步最近议题。