Gibt es eine Möglichkeit, eine JSON-Datei (enthält 100 Dokumente) in den Elasticsearch-Server zu importieren? Ich möchte eine große Json-Datei in den Es-Server importieren.
Sie sollten Bulk API verwenden. Beachten Sie, dass Sie vor jedem Json-Dokument eine Kopfzeile hinzufügen müssen.
$ cat requests
{ "index" : { "_index" : "test", "_type" : "type1", "_id" : "1" } }
{ "field1" : "value1" }
$ curl -s -XPOST localhost:9200/_bulk --data-binary @requests; echo
{"took":7,"items":[{"create":{"_index":"test","_type":"type1","_id":"1","_version":1,"ok":true}}]}
Wie bereits erwähnt, ist die Bulk-API wahrscheinlich der richtige Weg. Um Ihre Datei für das Massenprotokoll umzuwandeln, können Sie jq verwenden.
Angenommen, die Datei enthält nur die Dokumente selbst:
$ echo '{"foo":"bar"}{"baz":"qux"}' |
jq -c '
{ index: { _index: "myindex", _type: "mytype" } },
. '
{"index":{"_index":"myindex","_type":"mytype"}}
{"foo":"bar"}
{"index":{"_index":"myindex","_type":"mytype"}}
{"baz":"qux"}
Wenn die Datei die Dokumente in einer Liste der obersten Ebene enthält, müssen diese zuerst ausgepackt werden:
$ echo '[{"foo":"bar"},{"baz":"qux"}]' |
jq -c '
.[] |
{ index: { _index: "myindex", _type: "mytype" } },
. '
{"index":{"_index":"myindex","_type":"mytype"}}
{"foo":"bar"}
{"index":{"_index":"myindex","_type":"mytype"}}
{"baz":"qux"}
das Flag -c
von jq stellt sicher, dass sich jedes Dokument in einer eigenen Zeile befindet.
Wenn Sie direkt zum Curl-Pipe übergehen möchten, verwenden Sie --data-binary @-
und nicht nur -d
. Andernfalls werden die Zeilenumbrüche durch curl wieder entfernt.
Ich bin mir sicher, dass jemand das will, also mache ich es leicht, es zu finden.
FYI - Dies verwendet Node.js (im Wesentlichen als Batch-Skript) auf demselben Server wie die brandneue ES-Instanz. Ich habe es auf 2 Dateien mit jeweils 4000 Elementen verteilt und es dauerte nur etwa 12 Sekunden auf meinem freigegebenen virtuellen Server. YMMV
var elasticsearch = require('elasticsearch'),
fs = require('fs'),
pubs = JSON.parse(fs.readFileSync(__dirname + '/pubs.json')), // name of my first file to parse
forms = JSON.parse(fs.readFileSync(__dirname + '/forms.json')); // and the second set
var client = new elasticsearch.Client({ // default is fine for me, change as you see fit
Host: 'localhost:9200',
log: 'trace'
});
for (var i = 0; i < pubs.length; i++ ) {
client.create({
index: "epubs", // name your index
type: "pub", // describe the data thats getting created
id: i, // increment ID every iteration - I already sorted mine but not a requirement
body: pubs[i] // *** THIS ASSUMES YOUR DATA FILE IS FORMATTED LIKE SO: [{prop: val, prop2: val2}, {prop:...}, {prop:...}] - I converted mine from a CSV so pubs[i] is the current object {prop:..., prop2:...}
}, function(error, response) {
if (error) {
console.error(error);
return;
}
else {
console.log(response); // I don't recommend this but I like having my console flooded with stuff. It looks cool. Like I'm compiling a kernel really fast.
}
});
}
for (var a = 0; a < forms.length; a++ ) { // Same stuff here, just slight changes in type and variables
client.create({
index: "epubs",
type: "form",
id: a,
body: forms[a]
}, function(error, response) {
if (error) {
console.error(error);
return;
}
else {
console.log(response);
}
});
}
Ich hoffe, ich kann damit mehr als nur mir helfen. Keine Hexerei, aber jemand kann 10 Minuten sparen.
Prost
jq ist ein leichter und flexibler JSON-Prozessor für die Befehlszeile.
Verwendungszweck:
cat file.json | jq -c '.[] | {"index": {"_index": "bookmarks", "_type": "bookmark", "_id": .id}}, .' | curl -XPOST localhost:9200/_bulk --data-binary @-
Wir nehmen die Datei file.json und leiten den Inhalt zunächst mit dem Flag -c an jq, um eine kompakte Ausgabe zu erstellen. Hier ist das Nugget: Wir nutzen die Tatsache, dass jq nicht nur ein Objekt, sondern mehrere Objekte pro Eingabezeile erstellen kann. Für jede Zeile erstellen wir das Steuerelement, das JSON Elasticsearch benötigt (mit der ID unseres ursprünglichen Objekts) und eine zweite Zeile, die nur unser ursprüngliches JSON-Objekt (.) Ist.
Zu diesem Zeitpunkt haben wir unser JSON-Format so formatiert, wie es die Bulk-API von Elasticsearch erwartet, also leiten wir es einfach, um die POSTs an Elasticsearch zu locken!
Gutschrift geht an Kevin Marsh
Importieren Sie Nein, aber Sie können die Dokumente mithilfe der ES-API indizieren.
Sie können die Index-API verwenden, um jede Zeile zu laden (mit einer Art Code zum Lesen der Datei und zum Aufrufen der Curl-Aufrufe) oder mit der Index-Bulk-API, um sie alle zu laden. Angenommen, Ihre Datendatei kann so formatiert werden, dass sie damit funktioniert.
Ein einfaches Shell-Skript würde den Trick ausführen, wenn Sie sich mit Shell auskennen (etwa nicht getestet):
while read line
do
curl -XPOST 'http://localhost:9200/<indexname>/<typeofdoc>/' -d "$line"
done <myfile.json
Peronal würde ich Python wahrscheinlich entweder pyes oder den elastischen Such-Client verwenden.
pyes auf github
Python-Client für elastische Suche
Stream2es ist auch für das schnelle Laden von Daten in Es sehr nützlich und hat möglicherweise eine Möglichkeit, eine Datei einfach zu streamen. (Ich habe eine Datei nicht getestet, aber sie verwendet, um Wikipedia-Dokument für das Testen zu laden.)
Stream2es ist der einfachste Weg, IMO.
z.B. Angenommen, eine Datei "some.json", die eine Liste von JSON-Dokumenten enthält, eines pro Zeile:
curl -O download.elasticsearch.org/stream2es/stream2es; chmod +x stream2es
cat some.json | ./stream2es stdin --target "http://localhost:9200/my_index/my_type
sie können das Elasticsearch Gatherer Plugin verwenden
Das Gatherer-Plugin für Elasticsearch ist ein Framework zum skalierbaren Abrufen und Indexieren von Daten. Inhaltsadapter werden in Gatherer Zip-Archiven implementiert, die eine besondere Art von Plugins sind, die über Elasticsearch-Knoten verteilt werden können. Sie können Jobanforderungen empfangen und in lokalen Warteschlangen ausführen. Jobstatus werden in einem speziellen Index verwaltet.
Dieses Plugin befindet sich in der Entwicklung.
Meilenstein 1 - Versammlungs-Reißverschlüsse für Knoten bereitstellen
Meilenstein 2 - Spezifikation und Ausführung von Jobs
Meilenstein 3 - Portierung des JDBC-Flusses auf den JDBC-Sammler
Meilenstein 4 - Collecter-Jobverteilung nach Last/Warteschlangenlänge/Knotenname, Cron-Jobs
Meilenstein 5 - mehr Sammler, mehr Inhaltsadapter
Eine Möglichkeit besteht darin, ein Bash-Skript zu erstellen, das eine Masseneinfügung ausführt:
curl -XPOST http://127.0.0.1:9200/myindexname/type/_bulk?pretty=true --data-binary @myjsonfile.json
Nachdem Sie die Einfügung ausgeführt haben, führen Sie diesen Befehl aus, um die Anzahl zu ermitteln:
curl http://127.0.0.1:9200/myindexname/type/_count