Importieren / Indizieren einer JSON-Datei in Elasticsearch

87

Ich bin neu bei Elasticsearch und habe bis zu diesem Zeitpunkt 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 so etwas auch versucht, aber keinen Erfolg:

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

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

Shawn Roller
quelle

Antworten:

87

Der richtige Befehl, wenn Sie eine Datei mit Curl verwenden möchten, lautet:

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

Elasticsearch ist schemenlos, daher benötigen Sie nicht unbedingt eine Zuordnung. Wenn Sie den JSON so senden, wie er ist, und die Standardzuordnung verwenden, wird jedes Feld mit dem Standardanalysator indiziert und analysiert .

Wenn Sie mit Elasticsearch über die Befehlszeile zu interagieren möchten, können Sie einen Blick auf das haben elasticshell die ein wenig handlicher als curl sein sollte.

2019-07-10: Es ist zu beachten, dass benutzerdefinierte Zuordnungstypen veraltet sind und nicht verwendet werden sollten. Ich habe den Typ in der obigen URL aktualisiert, um leichter erkennen zu können, welcher der Index und welcher der Typ war, da beide mit dem Namen "Test" verwirrend waren.

Javanna
quelle
1
Ich arbeite nicht für mich, wenn ich Ihren Befehl eingebe, liefert die Konsole keine Daten.
Konrad
2
@Konrad Sie ersetzt jfblouvmlxecs01mit localhost, nicht wahr?
Ehtesh Choudhury
2
clwen - das "@" weist curl an, die Daten aus der json-Datei zu laden.
Oliver
1
Hallo, ich bin auch neu in der elastischen Suche. Kann mir jemand bitte sagen, wo diese .json-Dateien gespeichert werden sollen?
Swaheed
2
Wo speichere json Datei?
AV94
26

Laut den aktuellen Dokumenten https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html :

Wenn Sie eine Textdateieingabe zum Einrollen bereitstellen, müssen Sie das Flag --data-binary anstelle von plain -d verwenden. Letzteres bewahrt keine Zeilenumbrüche.

Beispiel:

$ curl -s -XPOST localhost:9200/_bulk --data-binary @requests
KenH
quelle
1
Beachten Sie, dass die _bulk load json-Datei keine gültige json-Datei ist. Die Syntax finden Sie im Link _bulk API. Außerdem müssen Sie keine _id angeben, wie in diesen Beispielen angegeben. Eine automatisch generierte _id wird bereitgestellt, wenn _id weggelassen wird.
Steve Tarver
15

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

Evan
quelle
6
Die angegebenen Beispiele decken die hier gestellte Frage nicht ab. Funktioniert es, wenn wir die JSON-Datei als Eingabe und die elastische Such-URL als Ausgabe angeben?
jgr0
11

Ich bin der Autor von elasticsearch_loader.
Ich habe ESL für genau dieses 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
MosheZada
quelle
Das ist nett! indexVor jedem Dokument wird die obligatorische Zeile hinzugefügt.
dr0i
2018-10-04 11: 51: 40.395741 FEHLERversuch [1/1] hat Ausnahme bekommen, es ist ein permanenter Datenverlust, kein erneuter Versuch mehr 2018-10-04 11: 51: 40.395741 WARN Chunk 0 hat Ausnahme (ConnectionTimeout verursacht durch - ReadTimeoutError (HTTPConnectionPool (Host = 'localhost', Port = 9200): Zeitüberschreitung beim Lesen (Zeitüberschreitung beim Lesen = 10.0)) während der Verarbeitung
Chiel
Abgesehen von der Tatsache, dass es nicht funktioniert, wo geben Sie die URL und den Port an?
Chiel
Sie können die GitHub-Seite besuchen oder ausführen, elasticsearch_loader --helpum die vollständige Hilfemeldung anzuzeigen. Sie können den Host angeben: Port mit--es-host http://hostname:port
MosheZada
Nett. Nur dass dies --typeüberflüssig wird, wenn Elasticsearch Typen in Version 6 entfernt. Elastic.co/guide/en/elasticsearch/reference/6.0/…
Vlad T.
8

Hinzufügen zu KenHs Antwort

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

Sie können ersetzen @requestsmit@complete_path_to_json_file

Hinweis: @ist vor dem Dateipfad wichtig

Ram Pratap
quelle
Kannst du ein Beispiel für den Pfad geben? Ich gebe "@c: \ accounts.json" und platziere es dort auch dann, es ist nicht in der Lage, es zu finden
Piyush Mittal
4
es sollte @ "c: \ accounts.json" sein
Ram Pratap
7

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

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, führen Sie es auf diese Weise aus. Hinweis: Produkt / Standard / im Befehl ist spezifisch für meine Umgebung. Sie können es weglassen oder durch das ersetzen, was für Sie relevant ist.

Gajendra D Ambi
quelle
6

Holen Sie sich einfach den Postboten von https://www.getpostman.com/docs/environments und geben Sie den Speicherort der Datei mit dem Befehl / test / test / 1 / _bulk? hübsch an. Geben Sie hier die Bildbeschreibung ein

Piyush Mittal
quelle
2
{"error": "Kein Handler für uri [/ test / test / 1 / _bulk? hübsch] und Methode [POST] gefunden"}
Chiel
{"Fehler": "Content-Type-Header [Text / Plain] wird nicht unterstützt", "Status": 406}
X. L
6

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, und zwar für jede Zeile der "reinen" JSON-Datei.

IE

{"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

Greg Dougherty
quelle
5

Du benutzt

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

Wenn 'Anfragen' eine JSON-Datei ist, müssen Sie dies in ändern

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

Wenn Ihre JSON-Datei nicht indiziert ist, müssen Sie zuvor 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 den Elasticsearch-Tutorials (Beispiel zum 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. Dies ist, wonach Sie suchen, nachdem Sie den Befehl jq verwendet haben. Dieses Format ist obligatorisch, um die Bulk-API zu verwenden. Einfache JSON-Dateien funktionieren nicht.

MLS
quelle
0

Wenn Sie VirtualBox und UBUNTU verwenden oder einfach UBUNTU verwenden, kann dies hilfreich 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
Sudarshan
quelle
0

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

Es ist beispielsweise eine gute Idee, Daten eindeutig zu exportieren / importieren.

Ich habe einen Prototyp eines elastischen Treibers erstellt . Es basiert auf FUSE

Demo

Jaroslaw Gaponow
quelle
0

Ab Elasticsearch 7.7 müssen Sie auch den Inhaltstyp angeben:

curl -s -H "Content-Type: application/json" -XPOST localhost:9200/_bulk --data-binary @<absolute path to JSON file>
thSoft
quelle