An Elasticsearch REST API client for Rust

Overview

elastic Latest Version Gitter

elastic is an efficient, modular API client for Elasticsearch written in Rust. The API is targeting the Elastic Stack 7.x.

elastic provides strongly-typed documents and weakly-typed queries.

Quick reference:

Also check out the official elasticsearch crate!

Stability

This crate is still quite unstable and is likely to continue to churn breaking releases over the near future with not-so-detailed changelogs.

If you run into any problems upgrading in your own open source projects feel free to open up an issue and we'll give you a hand. The goal is definitely to offer a stable API eventually.

Build Status

Platform Channel Status (master)
Linux / macOS Stable/Nightly Build Status
Windows Nightly Build status

Documentation

Version Docs
current (master) Documentation

Example

Add elastic to your Cargo.toml:

[dependencies]
elastic = "0.21.0-pre.5"
elastic_derive = "0.21.0-pre.5"
serde_json = "1"

Create a SyncClient and start making requests:

#[macro_use]
extern crate elastic_derive;
#[macro_use]
extern crate serde_json;
extern crate elastic;

use serde_json::Value;
use elastic::prelude::*;

// A reqwest HTTP client and default parameters.
// The builder includes the base node url (http://localhost:9200).
let client = SyncClient::builder().build()?;

let query = "some query string";

// A search request with a freeform body.
let res = client.search::<Value>()
                .index("_all")
                .body(json!({
                    "query": {
                        "query_string": {
                            "query": query
                        }
                    }
                }))
                .send()?;

// Iterate through the hits in the response.
for hit in res.hits() {
    println!("{:?}", hit);
}

elastic also offers an AsyncClient for use with the tokio asynchronous io stack. See the examples folder for complete samples.

Building documents

Document mapping is derived at compile-time from your Plain Old Rust Structures. Just add a #[derive(ElasticType)] attribute:

#[derive(ElasticType, Serialize, Deserialize)]
struct MyDocument {
	#[elastic(id)]
	pub id: String,
	pub title: String,
	pub timestamp: Date<DefaultDateMapping<EpochMillis>>,
	pub content: Text<DefaultTextMapping>,
}

And you can start using MyDocument in Client request methods.

See the docs for more details.

Alternatives

elastic.co released an official client, elasticsearch. Although it is still in an alpha stage (as of 2020-02-10), it is very comprehensive and generates most of its code from the official REST API specifications.

Additionally, if you'd like to use a strongly-typed Query DSL builder see rs-es. This client does the hard work of providing an idiomatic Rust API for interacting with Elasticsearch. It has the advantage of letting you know your queries will parse at compile-time instead of runtime.

Goals

To provide a full-featured and efficient Elasticsearch client for Rust over asynchronous io. Rust gives us a lot of tools for building super-performant but highly accessible libraries, which we aim to continue. elastic is aimed at people who need to work with Elasticsearch and are considering using Rust, as well as users that are already using Rust. We want to offer a solution to interacting with Elasticsearch that's compelling from both within and outside the Rust ecosystem.

The REST API is covered by a simple inline JSON macro like serde_json's json! so it's always possible to build any query. This means you don't need to learn another API for interacting with Elasticsearch; queries mocked in Dev Tools could just be copy+pasted into your Rust source.

The core focus of this project is on strong typing over your document types and query responses in Elasticsearch, rather than trying to map the entire Query DSL.

Support for Elastic's plugin products, like watcher and graph could be added as feature-gated modules as necessary.

License

Licensed under either of these:

Comments
  • Add Request Builders

    Add Request Builders

    Closes: #190 #189

    Working on some tweaks to the request pipeline to make it nicer to use. I'll experiment in here for a bit and try get the abstractions nicer.

    change:breaking 
    opened by KodrAus 18
  • How do I connect to an HTTPS node?

    How do I connect to an HTTPS node?

    I'm receiving the following error:

    ERROR es-install :: Client(ClientError { inner: Error(Request, State { next_error: Some(Error(Hyper(Error(Connect, Custom { kind: InvalidInput, error: NotHttp })), "https://localhost:9201/mt-ledger?pretty=true")), backtrace: None }) })
    

    Here is the code which produces this error:

    pub mod client {
        use elastic::{
            client::{prelude::SyncClient, SyncClientBuilder},
            error::Error,
        };
        use std::result::Result;
        pub fn make() -> Result<SyncClient, Error> {
            SyncClientBuilder::new()
                .static_node("https://localhost:9201")
                .params_fluent(move |p| p.url_param("pretty", true))
                .build()
        }
    }
    
    use mtledger::elasticsearch::client as EsClient;
    
    fn main() {
        let client = EsClient::make().expect("Failed to create ES client");
    
        match client.ping().send() {
            Ok(response) => {
                println!("PING :: {:?}", response);
            }
            Err(error) => {
                println!("ERROR es-ping :: {:?}", error);
            }
        }
    }
    

    How do I connect to an HTTPS node?

    opened by scull7 17
  • Question: Iterating results

    Question: Iterating results

    Hi, I've used your crate successfully to query ES - it works great, do you have any supporting crates (or plans for) to assist with processing the output/returns?

    I've spent quite a bit of time over the last few years parsing, iterating over results (aggregations as well as normal search hits), and am about to start playing with implementing an actual rusty Iterator for the results returned by your library. The idea is that it would facilitate hassle-free, fast (zero-copy) processing that can use rust's built in goodness (https://doc.rust-lang.org/beta/std/iter/index.html), as well as something like Rayon (https://github.com/nikomatsakis/rayon).

    Would love to get your thought on this, and if its something that you would be interested in as a contribution, where it should be plugged into this eco-system.

    Cheers,

    opened by stephanbuys 16
  • Rotor Http

    Rotor Http

    Long term, it looks like the new rotor_http might be a good base for building the HTTP off.

    https://github.com/tailhook/rotor-http/blob/master/src/client/request.rs

    Tasks

    • [x] Http GET connection to /_search
    • [x] Http POST connection to /_search with body
    • [x] Loop in separate thread that takes commands via Notifier
    • [x] Persistent connection to /_search with various bodies
    opened by KodrAus 14
  • Helpers for query processing (`elastic-helpers`?)

    Helpers for query processing (`elastic-helpers`?)

    This is a bit of a "wild" idea, but something worth considering for the future. In a larger system with lots of users it is really convenient to externalize queries into files, although the facility exists to define queries through structured Rust, there is something to be said for being able to prototype in Kibana or Sense and then take copy the query for use in other projects, this proposal would see us have:

    1. convenient method to load ES queries from files (say myquery.es), this is probably 3 lines of code of a good day, but might still make sense to have available to users.
    2. template pre-processing of query strings, use a crate such as tera to process raw queries just before submission which allows: updating a timestamp, swapping out a term field, etc, etc. This works surprisingly well for use-cases where it makes more sense to have queries stored as strings (perhaps in files)
    question 
    opened by stephanbuys 13
  • Switched default document type to _doc

    Switched default document type to _doc

    I would like to propose a breaking change that would allow the library to work with Elasticsearch 7 where the document type was removed after being deprecated in version 6.

    The change consists mostly of defaulting to the _doc type instead of doc. By doing this, most ES routes work as intended.

    I'm using this in one of my applications that uses the generated mapping and indexes documents just fine.

    Note that while it would be possible to manually specify the _doc type everywhere, the mapping API should still be changed from PUT /my-index/_mappings/_doc to PUT /my-index/_mapping.

    opened by mtorromeo 12
  • Creates deadlock/eternal loop in cargo

    Creates deadlock/eternal loop in cargo

    By adding Elastic dependency, whole cargo process breaks

    ~/.cargo/bin/cargo build
        Updating registry `https://github.com/rust-lang/crates.io-index`
    

    Runs forever. Removing this dependency, everything starts working fine

    bug 
    opened by zaibacu 12
  • Panic in index.rs example

    Panic in index.rs example

    Hello,

    When running the index.rs example, I receive the following error:

    thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Error(Response(Json(ErrorImpl { code: ExpectedSomeValue, line: 1, column: 1 })), State { next_error: None, backtrace: None })', /checkout/src/libcore/result.rs:860:4
    note: Run with `RUST_BACKTRACE=1` for a backtrace.
    

    The only change I have made to the example is adding the base URL for my own cluster using the base_url() function.

    I am using version 0.13.1 of elastic.

    I am happy to provide the full backtrace if it is helpful.

    Thanks for your time!

    bug 
    opened by outkaj 10
  • Async API and New Error Handling

    Async API and New Error Handling

    TODO

    • [x] Update CI to use new paths and run integration tests (on nightly? Or separate job?)
    • [x] Update all examples
    • [x] Fix current doc tests
    • [x] Add new doc tests for new items
    • [x] Update all links in docs

    Closes:

    • #195
    • #212
    • #223
    • #214
    • #226
    • #167

    Hopefully there won't be many more giant PRs like this for a while as the API starts to settle.

    Motivation

    I've rolled a few key API changes into this PR:

    • Support a futures-based asynchronous client without having to fork too much of the request code.
    • Provide a nicer story for error handling

    Design

    Async

    The current idea is to use a generic type to distinguish a synchronous from an asynchronous client. This looks something like:

    trait Sender {
        type Http;
        type Body;
    }
    
    impl Sender for SyncSender {
        type Http = reqwest::Client;
        type Body = elastic_reqwest::SyncBody;
    }
    
    impl Sender for AsyncSender {
        type Http = reqwest::unstable::async::Client;
        type Body = elastic_reqwest::AsyncBody;
    }
    
    struct Client<TSender: Sender> {
        http: TSender::Http
    }
    
    type SyncClient = Client<SyncSender>;
    type AsyncClient = Client<AsyncSender>;
    

    This means request builders can implement different behaviour depending on the kind of sender, or implement behaviour that's shared by all senders:

    struct RequestBuilder<TSender, TRequest> {
        client: Client<TSender>,
        inner: TRequest
    }
    
    // Behaviour for either a sync or async Sender
    impl<TSender: Sender> RequestBuilder<TSender, SearchRequestBuilder> {
        fn index(self, index: Index) -> Self {
            ...
        }
    }
    
    // Behaviour for a sync Sender
    impl RequestBuilder<SyncSender, SearchRequestBuilder> {
        fn send(self) -> Result<SearchResponse> {
            ...
        }
    }
    
    // Behaviour for an async Sender
    impl RequestBuilder<AsyncSender, SearchRequestBuilder> {
        fn send(self) -> impl Future<Item = SearchResponse> {
            ...
        }
    }
    

    The responses are currently not generic over the Sender, we've just got a SyncResponseBuilder and AsyncResponseBuilder. This was easier than trying to make them generic but is a bit of an asymmetrical wart on the API.

    Benefits

    • We don't have to duplicate request code, and it stays almost the same as it already is. We just pepper some generics around and add async implementations

    Drawbacks

    • It's quite complex and makes the rustdoc harder to follow.
    • The Sender type is a bit of a false abstraction, since it's not really useful apart from choosing one of two implementations. You can't reasonably go and implement Sender yourself and have everything work. It'll need some kind of Sealed supertrait if it was going to stay the same. Otherwise we'll need to pull all necessary types and callbacks into the Sender and thread that through the whole app, rather than forking sync and async when sending.
    • Responses are handled totally differently to requests. I think they should be roughly the same.

    Error Handling

    Offer errors types that:

    • can be extended without requiring a breaking change
    • are easily matchable when the error is likely recoverable
    • provide detailed output when the error is likely non-recoverable

    Right now, I'm making the assumption that:

    • API errors are likely recoverable
    • Any other kind of error (connection refused, invalid JSON, too many redirects etc) are likely non-recoverable.

    The new error type looks roughly like:

    pub enum Error {
        Api(ApiError),
        Client(ClientError),
        #[doc(hidden)]
        __NonExhaustive
    }
    
    pub struct ClientError {
        inner: inner::Error
    }
    
    mod inner {
        error_chain! {
            Build,
            Request,
            Response(u16),
        }
    }
    

    The idea is:

    • Any error can be converted into any ClientError from within the elastic crate. The inner error is simply boxed along with a backtrace by error-chain.
    • API errors are plain structures that can be matched and destructured
    • Client errors are black boxes that can be logged, but not matched

    Benefits

    • We've got freedom to tweak error types in elastic_reqwest, elastic_responses etc without affecting the error handling upstream
    • We don't have lots of duplicate error variants to manage

    Drawbacks

    • You can't do much with client errors besides log them. Maybe there are cases a client would like to know about individually and cater for
    • Each client error means boxing
    • We might be holding error-chain in a way it wasn't meant to be by hiding it away. Backtraces might get repeated and be difficult to follow

    Integration tests

    Add some infrastructure for spinning up an Elasticsearch node in a docker container and running a suite of idempotent integration tests against it. This should support different Elasticsearch/client configurations, such as requiring authentication, TLS, etc.

    This project is mostly about talking to Elasticsearch, so we need good confidence that it actually works.

    Having some ad-hoc integration tests is enough to get started, but using the YAML spec at some point in the future would also be good.

    change:breaking 
    opened by KodrAus 10
  • Mapping to a keyword type without a subfield

    Mapping to a keyword type without a subfield

    This might be really easy but I can't figure it out.

    The following:

    struct ID(String);
    
    impl KeywordFieldType<DefaultKeywordMapping> for ID {}
    

    maps to:

    "id": {
        "type": "text",
        "fields": {
            "keyword": {
                "type": "keyword",
                "ignore_above": 256
            }
        }
    }
    

    I want it to map to:

    "id": {
        "type": "keyword"
    }
    

    so that you don't have to specify id.keyword when searching...

    What am I missing?

    For good measure I have also tried:

    
    struct IdMapping;
    
    impl KeywordMapping for IdMapping {
        fn analyzer() -> Option<&'static str> {
            Some("keyword")
        }
    }
    
    impl KeywordFieldType<IdMapping> for ID {}
    
    opened by mwilliammyers 9
  • `get` and `search` not working in es>=6.0

    `get` and `search` not working in es>=6.0

    This might be related to #330...

    version: 0.21.0-pre.1

    If I index documents using bulk (and probably with index etc. too) like:

    #[derive(Serialize, Deserialize, ElasticType, Debug)]
    #[elastic(index = "test")]
    pub struct MyType {
        timestamp: ChronoDateTime,
    }
    
    let ops = (0..1000).into_iter().map(|i| {
        bulk::<MyType>().index(MyType {
            timestamp: "2019-02-18T00:00:00Z".parse().unwrap(),
        })
    });
    
    let response = client.bulk().extend(ops).send()?;
    

    querying the new documents via search or get like:

    client
        .search::<MyType>()
        .body(json!({ "query": { "match_all": {} } }))
        .send()?;
    

    produces an error:

    error sending a request or receiving a response. 
    Caused by: error receiving a response. 
    Status code: 200 OK
    


    However, manually building the request works:

    client
        .request(SimpleSearchRequest::for_index_ty(MyType::static_index(), MyType::static_ty()))
        .send()?
        .into_response::<SearchResponse<Value>>()?;
    

    Also, not sure if this is supposed to work, but it produces the same error:

    client
        .request(SimpleSearchRequest::for_index_ty(MyType::static_index(), MyType::static_ty()))
        .send()?
        .into_response::<SearchResponse<MyType>>()?;
    bug 
    opened by mwilliammyers 9
  • elastic::client::requests::document_index::Pending does not have method then()

    elastic::client::requests::document_index::Pending does not have method then()

    My code starting on line 169:

    let es = elastic::client::AsyncClientBuilder::new()
        .static_nodes(backend_url)
        .build()
        .unwrap(); // TODO
    let timestamp = Utc::now();
    let stats = Stats {
        core: "helsinki.fi".to_string(),
        status: res.response().status().as_u16(),
        query_time: entry_time.elapsed().whole_milliseconds(),
        timestamp: timestamp
            .format("%Y-%m-%d %H:%M:%S%.6f%:z")
            .to_string(),
        // TODO: remove stopwords
        original_query: clean_and_split_query(&q.1),
        query: clean_and_split_query(&q.1),
        stopword_count: 0,
        removed_stopwords: vec![],
    };
    let index_name = format!("searches-{}", timestamp.format("%Y%m%d"));
    let send_fut = es.document().index_raw(index_name, stats).send();
    send_fut.then(|_| ());
    

    My error message:

       --> src/logging.rs:189:34
        |
    189 |                         send_fut.then(|_| Ok(()));
        |                                  ^^^^ method not found in `elastic::client::requests::document_index::Pending`
        |
        = help: items from traits can only be used if the trait is in scope
        = note: the following trait is implemented but not in scope; perhaps add a `use` for it:
                `use futures::future::Future;`
    

    I do have this use line in my file:

    use futures::future::{ok, Ready, Future};
    
    opened by ronjakoi 2
  • Change Elastic mapping type of serde_json::Value

    Change Elastic mapping type of serde_json::Value

    The default mapping type for serde_json::Value is "nested" and that not allow make normal queries on ElasticSearch for dynamics data. How i can change the type to "object". Already i changed the code on file "src/elastic/src/types/document/mapping.rs" on trait ObjectMapping from NESTED_DATATYPE to OBJECT_DATATYPE and now my elastic queries are responding with results.

    opened by lfdominguez 2
  • Expected struct HitsTotal (pre-release)

    Expected struct HitsTotal (pre-release)

    This seems closely related to https://github.com/elastic-rs/elastic/issues/377 but opening a new issues as that one is closed.

    Getting "expected struct HitsTotal" issue with this on elasticsearch 6.7 (and the following versions for both elastic and elastic_derive crates).

    • 0.21.0-pre.2 ☑️ Good
    • 0.21.0-pre.3 ☑️ Good
    • 0.21.0-pre.4 ☑️ Good
    • 0.21.0-pre.5 ❌ Regression
    (Parse(ParseError { inner: Error(\"invalid type: integer `0`, expected struct HitsTotal\", line: 11, column: 16) }))
    
    Relevant code
    #[derive(Clone, Debug, Serialize, Deserialize, ElasticType)]
    pub struct PortfolioIdListing {
        pub id: String,
        pub idlisting: types::IdListing,
    }
    
    let response = esc
        .search::<es_models::PortfolioIdListing>()
        .index(EsIndex::Portfolio.name())
        .body(json!({
            "query": {
                "bool": {
                    "must": {
                            // -1 is what the JS import script sets them to by default
                        "term": { "pf_likes": -1 },
                    },
                    "must_not": {
                        "terms": { "idlisting": exclude },
                    },
                }
            },
            "size": Value::Number(BATCH_SIZE.into()),
            "_source": ["id", "idlisting"]
        }))
        .send()
    
    opened by brigand 0
  • Operations depend on StaticIndex

    Operations depend on StaticIndex

    Hey, thanks for making this!

    In the docs it's noted that you can specify index expressions, however, turning this on results in a huge pile of the trait `elastic::prelude::StaticIndex` is not implemented for ... errors as afaik many of the library methods are implemented over StaticIndex, and it's not super clear how to fix this?

    An example is put_mapping, which requires StaticIndex to create a PutMappingRequestBuilder, unfortunately the inner type is private so unless the type fulfills StaticIndex it is,, impossible (?), to set a mapping?

    opened by ryankurte 1
  • Bulk query crashing

    Bulk query crashing

    Whenever I try to make a bulk query with the following code my program crashes with a stack overflow exception:

    let ops = all_bets.into_iter().map(|x| bulk::<BetSummary>().index(x));                         
    client.bulk().index(BetSummary::index()).ty(BetSummary::static_ty()).extend(ops).send()?;  
    

    Could you let me know what I am doing wrong?

    opened by jawline 1
Releases(v0.20.10)
  • v0.20.10(May 7, 2018)

  • v0.20.8(Dec 17, 2017)

    This is another house-keeping release without any code changes.

    • Fixes some documentation errors around the index_exists method
    • Updates the licence field in Cargo.toml files to reflect the dual Apache/MIT license
    Source code(tar.gz)
    Source code(zip)
  • v0.20.7(Dec 17, 2017)

    This release adds the index_exists method to the client.

    elastic

    • Adds an index_exists method to the sync and async clients

    elastic_responses

    • Add an IndexExistsResponse type. Elasticsearch doesn't actually return any data with an index exists response (it just uses the HTTP status code), so this type doesn't actually represent what Elasticsearch's API returns
    • Adds support for returning arbitrary json data from the IsOk trait. This makes it possible to return data to deserialise as an IndexExistsResponse depending on the status code
    Source code(tar.gz)
    Source code(zip)
  • v0.20.6(Nov 30, 2017)

  • v0.20.5(Nov 25, 2017)

  • v0.20.3(Oct 27, 2017)

    This release adds some documentation to the generated Elasticsearch endpoint types.

    elastic_requests

    Generate documentation along with the endpoint types. The docs include:

    • The HTTP verb and default path for the endpoint
    • The path for each variant for the endpoint

    This should make it easier to work out what type corresponds to what request endpoint in Elasticsearch.

    Source code(tar.gz)
    Source code(zip)
  • v0.20.2(Oct 20, 2017)

    This release includes integration tests, doc fixes and some more endpoints on the client.

    elastic

    Added the following new endpoints to the Client:

    • document_update
    • document_delete
    • index_close
    • index_open
    • index_delete
    • ping

    Fixed some errors in documentation.

    elastic_responses

    Added the following new types:

    • UpdateResponse
    • DeleteResponse
    Source code(tar.gz)
    Source code(zip)
  • v0.20.1(Oct 16, 2017)

    There aren't any observable source changes in this release, just some house-keeping for builds and metadata.

    • Add elastic_queries into the tree. There isn't a release on crates.io for this yet
    • Add readme keys to Cargo.toml files
    Source code(tar.gz)
    Source code(zip)
  • v0.20.0(Oct 5, 2017)

    A note on this release

    There have been a lot of changes across many repositories. This makes it difficult to provide a comprehensive list of breaking changes (there are a number of them, but upgrading should be fairly mechanical). For future releases we'll start maintaining a CHANGELOG to collect changes as they occur.

    The following is a general list of significant changes.

    Async

    This release adds async support to elastic using the tokio and futures ecosystem.

    The implementation uses generics to parameterise request builders. This means we share a lot of code between the sync and async APIs, but can make the docs noisier and harder to follow.

    Combining repositories

    Each of the crates in the elastic organisation have been pulled in to this single repository. This will make it easier to track changes in the future, as well as share CI infrastructure. Overall it should lead to a more solid and contributor-friendly project.

    elastic now contains the following crates with synchronized versions:

    • elastic_requests
    • elastic_responses
    • elastic_types_derive_internals
    • elastic_types_derive
    • elastic_types
    • elastic_derive
    • elastic

    Some specifics

    elastic

    • Client has been renamed to SyncClient and ClientBuilder has been renamed to SyncClientBuilder
    • Client::new has been removed in favour of SyncClientBuilder

    elastic_types

    This release refactors Date to start reducing dependence on chrono::DateTime, and to make sure date formats aren't implicitly changed. Some of these changes might turn out to be too restrictive and may be reverted in the future (allowing formats to change without explicit conversions).

    • Change remap methods to be static methods instead of instance methods
    • Add DateExpr for supporting date math expressions

    Changes to Date

    • Change Date<F, M = DefaultDateMapping<F>> to Date<M>. So you can't just write Date<EpochMillis> anymore, it needs to be Date<DefaultDateMapping<EpochMillis>>. This simplifies the generics, and makes Date easier to work with. To get the ergonomics of Date<EpochMillis> back, you can use type aliases:
    // For default date types with just a single format
    type MyDateType = Date<DefaultDateMapping<EpochMillis>>;
    
    // For default date types with any format
    type MyDateType<F> = Date<DefaultDateMappinng<F>>;
    
    • Adds a DateValue and FormattableDateValue type
    • Use DateValue in the DateFormat::parse and DateFormat::format methods instead of chrono::DateTime
    • Remove the conversion from chrono::DateTime into Date<M> unless M::Format = ChronoFormat. This is because chrono::DateTime is already mappable with the ChronoFormat, so to make sure that formats aren't implicitly changed, you need to convert a chrono::DateTime into a DateValue first, which doesn't have any format:

    Before:

    let date = Date::from(chrono_date);
    

    After:

    let date = Date::from(DateValue::from(chrono_date));
    

    Changes to GeoPoint

    • Like Date, GeoPoint<F, M = DefaultGeoPointMapping<F>> has been changed to GeoPoint<M>. Use the same type aliases approach for ergonomics

    elastic_responses

    • Make all fields on response types private
    • Add iterators to response types. For BulkResponse and BulkErrorsResponse, call iter or into_iter. For SearchResponse call hits, into_hits, documents or into_documents.
    • Remove the SearchResponseOf and GetResponseOf types. Now SearchResponse and GetResponse require a generic type for the kind of document they contain. serde_json::Value is re-exported for convenience.
    Source code(tar.gz)
    Source code(zip)
  • v0.13.3(Aug 1, 2017)

  • v0.13.2(Jul 30, 2017)

    Adds basic logging support for requests and responses. This will log:

    • Request path
    • Response status if request succeeded
    • Response error if request failed (io error, rather than Elasticsearch error)
    Source code(tar.gz)
    Source code(zip)
  • v0.13.0(Jun 22, 2017)

    • Updates elastic_types to 0.18.0. See elastic_types release notes
    • Refactoring the RequestBuilder generics so they're more consistent for raw requests and high-level builders. This shouldn't really affect you unless you're taking RequestBuilders as arguments or returning them from methods
    Source code(tar.gz)
    Source code(zip)
  • v0.12.3(Jun 11, 2017)

  • v0.12.2(May 31, 2017)

    • Deprecates ResponseBuilder.raw and adds a new ResponseBuilder.into_raw method that does the same thing. The raw method will be removed in the next breaking release
    Source code(tar.gz)
    Source code(zip)
  • v0.12.1(May 31, 2017)

  • v0.12.0(May 31, 2017)

Owner
null
🦀 REST API client implementation for freee, auto-generated from OpenAPI specification.

freee-rs REST API client implementation for freee, auto-generated from OpenAPI specification. Getting Started Add to your Cargo.toml as follows: [depe

Naoki Ikeguchi 3 Jul 14, 2022
📺 Netflix in Rust/ React-TS/ NextJS, Actix-Web, Async Apollo-GraphQl, Cassandra/ ScyllaDB, Async SQLx, Kafka, Redis, Tokio, Actix, Elasticsearch, Influxdb Iox, Tensorflow, AWS

Fullstack Movie Streaming Platform ?? Netflix in RUST/ NextJS, Actix-Web, Async Apollo-GraphQl, Cassandra/ ScyllaDB, Async SQLx, Spark, Kafka, Redis,

null 34 Apr 17, 2023
Making Postgres and Elasticsearch work together like it's 2021

Making Postgres and Elasticsearch work together like it's 2021 Readme ZomboDB brings powerful text-search and analytics features to Postgres by using

ZomboDB 4.2k Jan 2, 2023
A Rust-based comment server using SQLite and an intuitive REST API.

soudan A Rust-based comment server using SQLite and an intuitive REST API. Soudan is built with simplicity and static sites in mind. CLI usage See sou

Elnu 0 Dec 19, 2022
High performance and distributed KV store w/ REST API. 🦀

About Lucid KV High performance and distributed KV store w/ REST API. ?? Introduction Lucid is an high performance, secure and distributed key-value s

Lucid ᵏᵛ 306 Dec 28, 2022
The most efficient, scalable, and fast production-ready serverless REST API backend which provides CRUD operations for a MongoDB collection

Optimal CRUD Mongo Goals of This Project This is meant to be the most efficient, scalable, and fast production-ready serverless REST API backend which

Evaluates2 1 Feb 22, 2022
SubZero - a standalone web server that turns your database directly into a REST/GraphQL api

What is this? This is a demo repository for the new subzero codebase implemented in Rust. subZero is a standalone web server that turns your database

subZero 82 Jan 1, 2023
This crate allows you to send cypher queries to the REST endpoint of a neo4j database

rusted_cypher Rust crate for accessing the cypher endpoint of a neo4j server This crate allows you to send cypher queries to the REST endpoint of a ne

Livio Ribeiro 68 Dec 1, 2022
Telegram bot API client for Rust

Frankenstein Telegram bot API client for Rust. It's a complete wrapper for Telegram bot API and it's up to date with version 5.2 of the API. Frankenst

Ayrat Badykov 136 Jan 1, 2023
Affine-client is a client for AFFINE based on Tauri

Affine Client affine-client is a client for AFFINE based on Tauri Supported Platforms Windows Linux MacOS Download https://github.com/m1911star/affine

Horus 216 Dec 25, 2022
A multi-instance, Discord/Spacebar API-compatible chat client

Polyphony A multi-instance, Discord/Spacebar API-compatible chat client, written in Rust and Svelte (TypeScript) using Tauri. Explore the docs » Repor

null 5 Mar 30, 2023
A multi-instance, Discord/Spacebar API-compatible chat client

Polyphony A multi-instance, Discord/Spacebar API-compatible chat client, written in Rust and Svelte (TypeScript) using Tauri. Explore the docs » Repor

null 6 Apr 3, 2023
Cassandra DB native client written in Rust language. Find 1.x versions on https://github.com/AlexPikalov/cdrs/tree/v.1.x Looking for an async version? - Check WIP https://github.com/AlexPikalov/cdrs-async

CDRS CDRS is looking for maintainers CDRS is Apache Cassandra driver written in pure Rust. ?? Looking for an async version? async-std https://github.c

Alex Pikalov 338 Jan 1, 2023
CouchDB client-side library for the Rust programming language

Chill Chill is a client-side CouchDB library for the Rust programming language, available on crates.io. It targets Rust Stable. Chill's three chief de

null 35 Jun 26, 2022
An etcd client library for Rust.

etcd An etcd client library for Rust. etcd on crates.io Documentation for the latest crates.io release Running the tests Install Docker and Docker Com

Jimmy Cuadra 138 Dec 27, 2022
Mysql client library implemented in rust.

mysql This crate offers: MySql database driver in pure rust; connection pool. Features: macOS, Windows and Linux support; TLS support via nativetls cr

Anatoly I 548 Dec 31, 2022
Streaming STOMP client for Rust

tokio-stomp An async STOMP client (and maybe eventually, server) for Rust, using the Tokio stack. It aims to be fast and fully-featured with a simple

null 7 Jun 15, 2022
Official Skytable client driver for Rust

Skytable client Introduction This library is the official client for the free and open-source NoSQL database Skytable. First, go ahead and install Sky

Skytable 29 Nov 24, 2022
Official Rust client for Central Dogma

centraldogma-rs Official Rust Client for Central Dogma. Full documentation is available at https://docs.rs/centraldogma Getting started Installing Add

LINE 44 Oct 13, 2022