Skip to content

Instantly share code, notes, and snippets.

@radzserg
Last active January 29, 2017 09:54
Show Gist options
  • Select an option

  • Save radzserg/571e07307298909367ee22245489f2d8 to your computer and use it in GitHub Desktop.

Select an option

Save radzserg/571e07307298909367ee22245489f2d8 to your computer and use it in GitHub Desktop.
An example of low level client
defmodule App.Es.EsClient do
@config Application.get_env(:app, :es)
@doc """
Builds index/type/id|action URL. Like index-prefix/index/id|action
"""
def build_url(index, id_or_action \\ nil, type \\ nil) do
host = @config[:host]
index_prefix = @config[:index_prefix]
type = case type do
nil -> "/#{index}"
false -> ""
type -> "/#{type}"
end
url = "#{host}/#{index_prefix}#{index}#{type}"
if id_or_action, do: "#{url}/#{id_or_action}", else: url
end
@doc """
Upsert - insert or update document if it exists in db
"""
def upsert(index, id, body) do
url = build_url(index, id)
result = request!(:put, url, encode!(body))
result = decode!(result.body)
{:ok, result}
end
@doc """
Check if index exists
"""
def index_exists?(index) do
url = build_url(index)
result = request!(:head, url)
case result.status_code do
404 -> false
200 -> true
end
end
@doc """
Delete ES index
"""
def delete_index(index) do
result = request!(:delete, build_url(index, nil, false))
case result.status_code do
200 -> {:ok, decode!(result.body)}
_ -> {:error, decode!(result.body)}
end
end
@doc """
Put mapping for idnex
"""
def put_mapping(index, mapping) do
url = build_url(index, nil, false)
result = request!(:put, url, encode!(%{mappings: mapping}))
case result.status_code do
200 -> {:ok, decode!(result.body)}
_ -> {:error, decode!(result.body)}
end
end
@doc """
Search in index
"""
def search(index, payload \\ %{}) do
url = build_url(index, "_search")
result = request!(:get, url, encode!(payload))
case result.status_code do
200 -> {:ok, decode!(result.body)}
_ -> {:error, decode!(result.body)}
end
end
defp document_exists?(index, id) do
url = build_url(index, id)
result = request!(:head, url)
case result.status_code do
404 -> false
200 -> true
end
end
defp encode!(data), do: Poison.encode!(data)
defp decode!(data), do: Poison.decode!(data)
defp requets!(method, url, payload), do: HTTPoison.request!(method, url, payload)
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment