extern crate elastic;
extern crate env_logger;
extern crate serde;
#[macro_use]
extern crate serde_derive;
#[macro_use]
extern crate serde_json;
use std::error::Error;
use serde_json::Value;
use elastic::prelude::*;
use elastic::client::responses::parse::*;
#[derive(Deserialize, Debug)]
struct SearchResponse {
hits: Hits,
}
#[derive(Deserialize, Debug)]
struct Hits {
hits: Vec<Hit>,
}
#[derive(Deserialize, Debug)]
struct Hit {
#[serde(rename = "_source")] pub source: Value,
}
impl IsOk for SearchResponse {
fn is_ok<B: ResponseBody>(head: HttpResponseHead, body: Unbuffered<B>) -> Result<MaybeOkResponse<B>, ParseResponseError> {
match head.status() {
200...299 => Ok(MaybeOkResponse::ok(body)),
_ => Ok(MaybeOkResponse::err(body)),
}
}
}
fn run() -> Result<(), Box<Error>> {
let client = SyncClientBuilder::new().build()?;
let query = json!({
"query": {
"query_string": {
"query": "*"
}
}
});
let res = client
.request(SearchRequest::new(query.to_string()))
.params(|q| q.url_param("filter_path", "hits.hits._source"))
.send()?
.into_response::<SearchResponse>()?;
for hit in &res.hits.hits {
println!("{:?}", hit);
}
println!("{:?}", res);
Ok(())
}
fn main() {
env_logger::init().unwrap();
run().unwrap()
}