Upgrading from 0.1.x to 0.2.x
Version 0.2.0 brings this library in line with Elixir best practices for configuration.
Rationale
Configuration is no longer global. Instead, you configure
Elasticsearch.Cluster modules, which are GenServers. This has several
benefits:
A single OTP app can talk to multiple Elasticsearch clusters. This is useful for umbrella apps in particular.
Reading from environment variables is standardized. You do it by overriding the cluster's
init/1callback, as in Ecto and Phoenix.You can start clusters like any other genserver, passing in configuration at that time.
You can bypass clusters altogether by passing configuration instead of a cluster to any function that expects a cluster.
Changes
BREAKING: an Elasticsearch.Cluster module or configuration map is now
required for all Elasticsearch function calls.
BREAKING: {:system, "ENV_VAR"} is no longer supported in configuration.
Instead, you should read from environment variables in the init/1 callback
as described in the Elasticsearch.Cluster documentation.
BREAKING: The :api_module configuration option has been renamed
to :api.
BREAKING: The required callbacks for Elasticsearch.API have been
simplified down to a single request/5 function.
BREAKING: mix elasticsearch.build now requires the --cluster option.
How to Update Your App
First, add a Cluster to your application:
defmodule MyApp.ElasticsearchCluster do
use Elasticsearch.Cluster, otp_app: :my_app
endNext, switch over your :elasticsearch configuration over to your
application, and include the cluster. Be sure to rename the :api_module
option to :api. See Elasticsearch.Cluster for more options.
# BEFORE
config :elasticsearch,
url: "http://localhost:9200",
api_module: Elasticsearch.API.HTTP,
# ...
# AFTER
config, :my_app, MyApp.ElasticsearchCluster,
url: "http://localhost:9200",
api: Elasticsearch.API.HTTP,
# ...Next, be sure to start your Cluster in your application supervisor:
children = [
MyApp.ElasticsearchCluster
]Next, add your cluster to all calls to Elasticsearch functions:
# BEFORE
Elasticsearch.post("/posts/_search", %{...})
# AFTER
Elasticsearch.post(MyApp.ElasticsearchCluster, "/posts/_search", %{...})Next, update any mock implementations of Elasticsearch.API to implement the
request/5 function instead of the previous functions.
# BEFORE
defmodule MyApp.ElasticsearchMock do
@behaviour Elasticsearch.API
def get("/url", _opts) do
{:ok, %HTTPoison.Response{}}
end
end
# AFTER
defmodule MyApp.ElasticsearchMock do
@behaviour Elasticsearch.API
@impl true
def request(_config, :get, "/url", _data, _opts) do
{:ok, %HTTPoison.Response{}}
end
endFinally, update any calls to mix elasticsearch.build to include the cluster
as an option:
mix elasticsearch.build [index] --cluster MyApp.ElasticsearchCluster