Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/tsloughter/erlastic_search
An Erlang app for communicating with Elastic Search's rest interface.
https://github.com/tsloughter/erlastic_search
Last synced: 3 days ago
JSON representation
An Erlang app for communicating with Elastic Search's rest interface.
- Host: GitHub
- URL: https://github.com/tsloughter/erlastic_search
- Owner: tsloughter
- License: lgpl-3.0
- Created: 2010-02-14T15:00:59.000Z (almost 15 years ago)
- Default Branch: master
- Last Pushed: 2020-02-19T22:45:05.000Z (almost 5 years ago)
- Last Synced: 2025-01-01T10:05:02.987Z (10 days ago)
- Language: Erlang
- Homepage:
- Size: 4.89 MB
- Stars: 165
- Watchers: 16
- Forks: 79
- Open Issues: 5
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- freaking_awesome_elixir - Erlang - An Erlang app for communicating with Elastic Search's rest interface. (ORM and Datamapping)
- fucking-awesome-elixir - erlastic_search - An Erlang app for communicating with Elastic Search's rest interface. (ORM and Datamapping)
- awesome-elixir - erlastic_search - An Erlang app for communicating with Elastic Search's rest interface. (ORM and Datamapping)
README
ErlasticSearch
======================================An Erlang client for [Elasticsearch](https://www.elastic.co/products/elasticsearch).
Build and Run
-------------Start a rebar3 shell
```shell
rebar3 shell
```Create an index :
```erlang
erlastic_search:create_index(<<"index_name">>).
```
```
{ok, [{<<"ok">>,true},{<<"acknowledged">>,true}]}
```Index a document :
```erlang
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) :
```erlang
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 :
```erlang
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">>}]}]]}]}]}
```Testing
-------In another terminal use docker-compose to start an Elasticsearch instance :
```bash
docker-compose up
```For convenience, you can also start a Kibana instance for analysis/visualization :
```bash
docker-compose -f docker-compose.yml -f docker-compose-kibana.yml up
```Run Common Test:
```bash
rebar3 ct
```Using another JSON library than `jsx`
-------------------------------------By default, we assume all the JSON erlang objects passed to us are in
[`jsx`](https://github.com/talentdeficit/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`](https://github.com/davisp/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:
```shell
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:```erlang
-callback encode(erlastic_json()) -> binary().
-callback decode(binary()) -> erlastic_json().
```
where `erlastic_json()` is a type mapping to your JSON representation of choice.