Bazy NoSQL WB@NOSQL

Hurtowy import danych do Elasticsearch

Dokumentacja:

The Elasticsearch REST API expects the following JSON structure:

{ "index" : { "_index" : "db", "_type" : "collection", "_id" : "id" } }  action and meta data
... JSON to be imported into Elasticsearch ...

Depending on the usage some fields are optional.

Generujemy „przeplatane” JSON-y

Zwykle dane mamy w pliku authors.json, po jednym JSON-ie w wierszu, przykładowo

{ "aphorism": "By dojść do źródła, trzeba płynąć pod prąd.", "tags": ["idea"] }

Aby zaimportować do Elasticsearch dane hurtem, musimy każdy JSON poprzedzić JSONE-em z „action and metadata”, przykładowo takim:

{ "index": { "_type": "lec" } }
{ "aphorism": "By dojść do źródła, trzeba płynąć pod prąd.", "tags": ["idea"] }

Jak to zrobić? Skorzystamy z narzędzia jq:

cat aphorisms.json | \
  jq --compact-output '{ "index": { "_type": "lec" } }, .' > aphorisms.bulk

To samo co powyżej, ale bez polecenia cat:

< aphorisms.js jq --compact-output '{ "index": { "_type": "lec" } }, .' > aphorisms.bulk

JSON-y zapiszemy w authors/lec. Przed zapisaniem danych w elasticsearch, usuniemy index authors (dlaczego?):

curl -s -XDELETE localhost:9200/authors
curl -s -XPOST   localhost:9200/authors/_bulk --data-binary @aphorisms.bulk

CRUD

Delete, delete-lec-authors.bulk:

{ "delete" : { "_index" : "authors", "_type" : "lec", "_id" : "1" } }
{ "delete" : { "_index" : "authors", "_type" : "lec", "_id" : "2" } }

Przykład:

curl -s -XPOST localhost:9200/_bulk --data-binary @delete-lec-authors.bulk

Create or ‘put-if-absent’, create-authors.bulk:

{ "create": { "_index": "authors", "_type": "lec", "_id": 1 } }
{ "aphorism": "Czas robi swoje. A ty człowieku?", "tags": ["man", "time"] }
{ "create": { "_index": "authors", "_type": "lec", "_id": 4 } }
{ "aphorism": "Bądź realistą: nie mów prawdy.", "tags": ["idea", "truth"] }

Przykład:

curl -s -XPOST localhost:9200/_bulk --data-binary @create-authors.bulk