web-dev-qa-db-de.com

Importieren/Indizieren Sie eine JSON-Datei in Elasticsearch

Ich bin neu bei Elasticsearch und habe bisher Daten manuell eingegeben. Zum Beispiel habe ich so etwas gemacht:

$ curl -XPUT 'http://localhost:9200/Twitter/Tweet/1' -d '{
    "user" : "kimchy",
    "post_date" : "2009-11-15T14:12:12",
    "message" : "trying out Elastic Search"
}'

Ich habe jetzt eine .json-Datei und möchte diese in Elasticsearch indizieren. Ich habe auch so etwas ausprobiert, aber kein Erfolg:

curl -XPOST 'http://jfblouvmlxecs01:9200/test/test/1' -d lane.json

Wie importiere ich eine .json-Datei? Gibt es Schritte, die ich zuerst durchführen muss, um sicherzustellen, dass die Zuordnung korrekt ist?

67
Shawn Roller

Der richtige Befehl, wenn Sie eine Datei mit curl verwenden möchten, lautet wie folgt:

curl -XPOST 'http://jfblouvmlxecs01:9200/test/test/1' -d @lane.json

Elasticsearch ist ein Schema, daher benötigen Sie nicht unbedingt ein Mapping. Wenn Sie den Json so senden, wie er ist, und das Standard-Mapping verwenden, wird jedes Feld mit dem Standard Analyzer indiziert und analysiert.

Wenn Sie mit Elasticsearch über die Befehlszeile interagieren möchten, sollten Sie sich die elasticshell anschauen, die etwas handlicher als curl sein sollte.

73
javanna

Gemäß den aktuellen Dokumenten http://www.elasticsearch.org/guide/de/elasticsearch/reference/current/docs-bulk.html

Wenn Sie eine Textdatei für curl eingeben, müssen Sie die .__ verwenden. --data-binary-Flag anstelle von plain -d. Letzteres behält keine Zeilenumbrüche bei.

Beispiel: 

$ curl -s -XPOST localhost:9200/_bulk --data-binary @requests
24
KenH

Wir haben ein kleines Werkzeug für diese Art von Dingen erstellt https://github.com/taskrabbit/elasticsearch-dump

13
Evan

Hinzufügen zu KenHs Antwort

$ curl -s -XPOST localhost:9200/_bulk --data-binary @requests

Sie können @requests durch @complete_path_to_json_file ersetzen.

Hinweis: @ist vor dem Dateipfad wichtig

7
Ram Pratap

holen Sie sich einfach den Postboten von https://www.getpostman.com/docs/environments und geben Sie den Dateispeicherort mit/test/test/1/_bulk? pretty command . an. enter image description here

6
Piyush Mittal

Du benutzt 

$ curl -s -XPOST localhost:9200/_bulk --data-binary @requests

Wenn "request" eine Json-Datei ist, müssen Sie dies in ändern 

$ curl -s -XPOST localhost:9200/_bulk --data-binary @requests.json

Wenn Ihre Json-Datei jetzt nicht indiziert ist, müssen Sie vor jeder Zeile in der Json-Datei eine Indexzeile einfügen. Sie können dies mit JQ tun. Siehe folgenden Link: http://kevinmarsh.com/2014/10/23/using-jq-to-import-json-into-elasticsearch.html

Gehen Sie zu Elasticsearch-Tutorials (Beispiel: Shakespeare-Tutorial), laden Sie das verwendete json-Dateibeispiel herunter und sehen Sie es sich an. Vor jedem Json-Objekt (jeder einzelnen Zeile) befindet sich eine Indexzeile. Nach diesem Befehl suchen Sie nach dem Befehl jq. Dieses Format ist für die Verwendung der Bulk-API obligatorisch. Json-Dateien funktionieren nicht.

4
MLS

Ich bin der Autor von elasticsearch_loader
Ich habe ESL für dieses genaue Problem geschrieben. 

Sie können es mit pip herunterladen:

pip install elasticsearch-loader

Und dann können Sie Json-Dateien in Elasticsearch laden, indem Sie Folgendes ausgeben:

elasticsearch_loader --index incidents --type incident json file1.json file2.json
4
MosheZada

Ich habe nur sichergestellt, dass ich im selben Verzeichnis wie die Json-Datei bin und diese dann einfach ausgeführt habe

curl -s -H "Content-Type: application/json" -XPOST localhost:9200/product/default/_bulk?pretty --data-binary @product.json

Wenn Sie also auch sicherstellen, dass Sie sich im selben Verzeichnis befinden, und führen Sie es auf diese Weise aus. __ Hinweis: product/default/im Befehl ist etwas spezifisch für meine Umgebung. Sie können es weglassen oder durch das ersetzen, was für Sie relevant ist.

3
Gajendra D Ambi

Eines habe ich noch nicht erwähnt: Die JSON-Datei muss eine Zeile enthalten, die den Index angibt, zu dem die nächste Zeile gehört, für jede Zeile der "reinen" JSON-Datei.

I.E.

{"index":{"_index":"shakespeare","_type":"act","_id":0}}
{"line_id":1,"play_name":"Henry IV","speech_number":"","line_number":"","speaker":"","text_entry":"ACT I"}

Ohne das funktioniert nichts und es wird Ihnen nicht sagen warum

3
Greg Dougherty

wenn Sie VirtualBox und UBUNTU verwenden oder einfach UBUNTU verwenden, kann dies nützlich sein 

wget https://github.com/andrewvc/ee-datasets/archive/master.Zip
Sudo apt-get install unzip (only if unzip module is not installed)
unzip master.Zip
cd ee-datasets
Java -jar elastic-loader.jar http://localhost:9200 datasets/movie_db.eloader
1
sudarshan

Ich habe etwas Code geschrieben, um die Elasticsearch-API über eine Dateisystem-API verfügbar zu machen.

Es ist zum Beispiel eine gute Idee für einen klaren Export/Import von Daten.

Ich habe PrototypElasticdriver erstellt. Es basiert auf Fuse

 demo

0