#[cfg(any(feature = "native-tls", feature = "rustls-tls"))]
use elasticsearch::cert::CertificateValidation;
use elasticsearch::{
auth::Credentials,
http::{
response::Response,
transport::{SingleNodeConnectionPool, TransportBuilder},
},
indices::IndicesExistsParts,
params::Refresh,
BulkOperation, BulkParts, Elasticsearch, Error, DEFAULT_ADDRESS,
};
use reqwest::StatusCode;
use serde_json::json;
use url::Url;
pub fn cluster_addr() -> String {
match std::env::var("ELASTICSEARCH_URL") {
Ok(server) => server,
Err(_) => DEFAULT_ADDRESS.into(),
}
}
pub fn create_default_builder() -> TransportBuilder {
create_builder(cluster_addr().as_str())
}
pub fn create_builder(addr: &str) -> TransportBuilder {
let mut url = Url::parse(addr).unwrap();
let credentials = if url.scheme() == "https" {
let username = if !url.username().is_empty() {
let u = url.username().to_string();
url.set_username("").unwrap();
u
} else {
"elastic".into()
};
let password = match url.password() {
Some(p) => {
let pass = p.to_string();
url.set_password(None).unwrap();
pass
}
None => "changeme".into(),
};
Some(Credentials::Basic(username, password))
} else {
None
};
let conn_pool = SingleNodeConnectionPool::new(url.clone());
let mut builder = TransportBuilder::new(conn_pool);
if let Some(c) = credentials {
builder = builder.auth(c);
}
#[cfg(any(feature = "native-tls", feature = "rustls-tls"))]
{
if url.scheme() == "https" {
builder = builder.cert_validation(CertificateValidation::None);
}
}
builder
}
pub fn create_default() -> Elasticsearch {
create_for_url(cluster_addr().as_str())
}
pub fn create_for_url(url: &str) -> Elasticsearch {
let builder = create_builder(url);
create(builder)
}
pub fn create(builder: TransportBuilder) -> Elasticsearch {
let transport = builder.build().unwrap();
Elasticsearch::new(transport)
}
pub async fn index_documents(client: &Elasticsearch) -> Result<Response, Error> {
let index = "posts";
let exists_response = client
.indices()
.exists(IndicesExistsParts::Index(&[index]))
.send()
.await?;
if exists_response.status_code() == StatusCode::NOT_FOUND {
let mut body: Vec<BulkOperation<_>> = vec![];
for i in 1..=10 {
let op = BulkOperation::index(json!({"title":"Elasticsearch"}))
.id(i.to_string())
.into();
body.push(op);
}
client
.bulk(BulkParts::Index(index))
.body(body)
.refresh(Refresh::WaitFor)
.send()
.await
} else {
Ok(exists_response)
}
}