An Erlang client for Elasticsearch.
Start a rebar3 shell
rebar3 shell
Create an index :
erlastic_search:create_index(<<"index_name">>).
{ok, [{<<"ok">>,true},{<<"acknowledged">>,true}]}
Index a document :
erlastic_search:index_doc(<<"index_name">>, <<"type">>, [{<<"key1">>, <<"value1">>}]).
{ok,[{<<"ok">>,true},
{<<"_index">>,<<"index_name">>},
{<<"_type">>,<<"type">>},
{<<"_id">>,<<"T-EzM_yeTkOEHPL9cN5B2g">>},
{<<"_version">>,1}]}
Index a document (providing a document id) :
erlastic_search:index_doc_with_id(<<"index_name">>, <<"type">>, <<"id1">>, [{<<"key1">>, <<"value1">>}]).
{ok,[{<<"ok">>,true},
{<<"_index">>,<<"index_name">>},
{<<"_type">>,<<"type">>},
{<<"_id">>,<<"id1">>},
{<<"_version">>,2}]}
Search for a document :
erlastic_search:search(<<"index_name">>, <<"type">>, <<"key1:value1">>).
{ok,[{<<"took">>,6},
{<<"timed_out">>,false},
{<<"_shards">>,
[{<<"total">>,5},{<<"successful">>,5},{<<"failed">>,0}]},
{<<"hits">>,
[{<<"total">>,3},
{<<"max_score">>,0.30685282},
{<<"hits">>,
[[{<<"_index">>,<<"index_name">>},
{<<"_type">>,<<"type">>},
{<<"_id">>,<<"T-EzM_yeTkOEHPL9cN5B2g">>},
{<<"_score">>,0.30685282},
{<<"_source">>,[{<<"key1">>,<<"value1">>}]}],
[{<<"_index">>,<<"index_name">>},
{<<"_type">>,<<"type">>},
{<<"_id">>,<<"id1">>},
{<<"_score">>,0.30685282},
{<<"_source">>,[{<<"key1">>,<<"value1">>}]}],
[{<<"_index">>,<<"index_name">>},
{<<"_type">>,<<"type">>},
{<<"_id">>,<<"MMNcfNHUQyeizDkniZD2bg">>},
{<<"_score">>,0.30685282},
{<<"_source">>,[{<<"key1">>,<<"value1">>}]}]]}]}]}
In another terminal use docker-compose to start an Elasticsearch instance :
docker-compose up
For convenience, you can also start a Kibana instance for analysis/visualization :
docker-compose -f docker-compose.yml -f docker-compose-kibana.yml up
Run Common Test:
rebar3 ct
By default, we assume all the JSON erlang objects passed to us are in
jsx
's representation.
And similarly, all of Elasticsearch's replies will be decoded with jsx
.
However, you might already be using another JSON library in your project, which
might encode and decode JSONs from and to a different erlang representation.
For example, jiffy
:
1> SimpleJson = <<"{\"key\":\"value\"}">>.
<<"{\"key\":\"value\"}">>
2> jiffy:decode(SimpleJson).
{[{<<"key">>,<<"value">>}]}
3> jsx:decode(SimpleJson).
[{<<"key">>,<<"value">>}]
In that case, you probably want erlastic_search
to use your JSON
representation of choice instead of jsx
's.
You can do so by defining the ERLASTIC_SEARCH_JSON_MODULE
environment
variable when compiling erlastic_search
, for example:
export ERLASTIC_SEARCH_JSON_MODULE=jiffy
rebar compile
The only constraint is that ERLASTIC_SEARCH_JSON_MODULE
should be the name
of a module, in your path, that defines the two following callbacks:
-callback encode(erlastic_json()) -> binary().
-callback decode(binary()) -> erlastic_json().
where erlastic_json()
is a type mapping to your JSON representation of choice.