# Elastex
Data driven elixir client for Elasticsearch.
## Get Started
1. Add this to your mix.exs file
```elixir
{:elastex, "~> 0.2.0"}
```
2. Add config setup in the appropriate config file for your environment i.e. `config/dev.exs`
```elixir
config :elastex, url: "http://localhost:9200"
```
3. Enjoy! (documentation is located here ...TODO add link)
## Data driven?
Elastex has two functions that perform side effects `Elastex.run/1` and `Elastex.run/2`
All other functions in Elastex return or operate on `%Elastex.Builder{}`
For example `Elastex.Search.query` returns a builder
```elixir
iex> Elastex.Search.query
%Elastex.Builder{
url: "_search",
method: :post,
action: :search_query
}
```
Elasticsearch allows searching through params so we can update our initial query by updating the builder.
Adding params for search queries can be added by `Elastex.Search.params/1`
```elixir
iex> Elastex.Search.query |> Elastex.Search.params([q: "user:mike"])
%Elastex.Builder{
url: "_search",
method: :post,
action: :search_query,
params: [q: "user:mike"]
}
```
Operating on the builders (data) instead of having each function make a HTTP request allows for easier manipulation and testing.
A great example of working with data is `Elastex.Search.multi_search/1`
```elixir
iex> query_builders = [
...> Elastex.Search.query(%{hello: "world"}),
...> Elastex.Search.query(%{hello: "world"}, "twitter", "tweet")
...> ]
iex> Elastex.Search.multi_search(query_builders)
%Elastex.Builder {
url: "_msearch",
body: "...",
method: :post,
action: :multi_search
}
```
Here multi search takes normal `Elastex.Search.query` functions and uses them as input. This same technique is used for `Elastex.Document.bulk`.
## Examples
```elixir
# search example
%{query: %{term: %{user: "mike"}}}
|> Elastex.Search.query()
|> Elastex.run
# document example
Elastex.Document.index("twitter", "tweet", 1) |> Elastex.run
# index example
Elastex.Index.create("twitter") |> Elastex.run
# cluster example
Cluster.health("twitter") |> Elastex.run
```