est-il possible d'importer un fichier json(contient 100 documents) dans elasticsearch serveur.?

y a-t-il un moyen d'importer un fichier JSON (contient 100 documents) dans elasticsearch server? Je veux importer un gros fichier json en es-serveur..

28
demandé sur shailendra pathak 2013-12-18 03:32:26

9 réponses

Vous devez utiliser en Vrac. Notez que vous devrez ajouter une ligne d'en-tête avant chaque document json.

$ 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}}]}
18
répondu dadoonet 2013-12-18 06:19:48

comme dadoonet l'a déjà mentionné, l'API bulk est probablement la solution. Pour transformer votre fichier pour l'essentiel protocole, vous pouvez utiliser jq.

en supposant que le fichier ne contient que les documents eux-mêmes:

$ 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"}

et si le fichier contient les documents dans une liste de premier niveau, ils doivent être déballés en premier:

$ 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"}

jq -c indicateur permet de s'assurer que chaque document est sur une ligne.

Si vous voulez tuyau directement à curl, vous aurez envie d'utiliser --data-binary @-, et pas seulement -d, sinon curl va encore enlever les lignes.

38
répondu Peter 2015-06-17 18:01:35

je suis sûr que quelqu'un veut cela donc je vais le rendre facile à trouver.

FYI-ceci utilise noeud.js (essentiellement sous forme de script batch) sur le même serveur que l'instance es toute neuve. Lancé sur 2 fichiers avec 4000 éléments chacun et il n'a pris environ 12 secondes sur mon serveur virtuel partagé. 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);
    }
  });
}

J'espère que je peux aider plus que moi-même avec ça. Ce n'est pas de la science, mais ça pourrait sauver quelqu'un de 10 minutes.

Cheers

11
répondu Deryck 2014-08-09 12:02:00

jq est un processeur JSON léger et flexible.

Utilisation:

cat file.json | jq -c '.[] | {"index": {"_index": "bookmarks", "_type": "bookmark", "_id": .id}}, .' | curl -XPOST localhost:9200/_bulk --data-binary @-

nous prenons le fichier.json et la tuyauterie de son contenu à jq d'abord avec le drapeau-c pour construire la sortie compacte. Voici le nugget: nous profitons du fait que jq peut construire non seulement un mais plusieurs objets par ligne d'entrée. Pour chaque ligne, nous créons le contrôle JSON Elasticsearch needs (avec L'ID de notre objet original) et créer une deuxième ligne qui est juste notre objet JSON original (.).

à ce stade, nous avons notre JSON formaté la façon dont L'API en vrac D'Elasticsearch s'y attend, donc nous l'avons simplement pipe à curl qui le poste à Elasticsearch!

le crédit va à Kevin Marsh

8
répondu max 2016-07-05 10:12:33

importer non, mais vous pouvez indexer les documents en utilisant L'API ES.

Vous pouvez utiliser l'api index pour charger chaque ligne (en utilisant une sorte de code pour lire le fichier et faire les appels de boucle) ou l'api index pour les charger toutes. En supposant que votre fichier de données peut être formaté pour fonctionner avec elle.

Lire la suite ici: API ES

un simple script shell ferait l'affaire si vous êtes à l'aise avec shell quelque chose comme ceci peut-être (pas testé):

while read line
do
curl -XPOST 'http://localhost:9200/<indexname>/<typeofdoc>/' -d "$line"
done <myfile.json

Peronally, je serais probablement utiliser Python soit pyes ou l'élastique à la recherche du client.

pyes sur github

elastic search client python

Stream2es est également très utile pour charger rapidement des données dans es et peut avoir un moyen de simplement streamer un fichier. (Je n'ai pas testé un fichier mais je l'ai utilisé pour charger wikipedia doc pour des tests de performance)

8
répondu mconlin 2017-02-15 19:54:02

Stream2es est la voie la plus facile IMO.

par exemple, en supposant un fichier "certains.json" contenant une liste de documents JSON, un par ligne:

curl -O download.elasticsearch.org/stream2es/stream2es; chmod +x stream2es
cat some.json | ./stream2es stdin --target "http://localhost:9200/my_index/my_type
5
répondu Jon Burgess 2015-05-25 11:08:20

Vous pouvez utiliser esbulk, rapide et simple, en vrac indexeur:

$ esbulk -index myindex file.ldj

Voici un asciicast montrant le chargement du Projet Gutenberg données dans Elasticsearch dans environ 11s.

Disclaimer: je suis l'auteur.

4
répondu miku 2015-12-02 23:50:31

vous pouvez utiliser Elasticsearch Gatherer Plugin

le plugin gatherer pour Elasticsearch est un framework pour la collecte et l'indexation de données évolutives. Les adaptateurs de contenu sont implémentés dans les archives zip De gatherer qui sont un type particulier de plugins distribuables sur les noeuds Elasticsearch. Ils peuvent recevoir des demandes d'emploi et les exécuter dans des files d'attente locales. Les États d'emploi sont maintenus dans un indice spécial.

ce plugin est en développement.

Jalon 1-déploiement ramasse zips aux noeuds

Jalon 2-spécification et exécution des tâches

Jalon 3-Transfert de la rivière JDBC au collecteur JDBC

Jalon 4-Répartition des tâches de cueillette par charge / longueur de file/nom de noeud, cron jobs

Jalon 5 - plus de cueilleurs, plus d'adaptateurs de contenu

référence https://github.com/jprante/elasticsearch-gatherer

3
répondu 2015-12-28 09:12:09

Une solution est de créer un script bash qui fait un bulk insert:

curl -XPOST http://127.0.0.1:9200/myindexname/type/_bulk?pretty=true --data-binary @myjsonfile.json

après avoir lancé l'insertion, lancez cette commande pour obtenir le nombre:

curl http://127.0.0.1:9200/myindexname/type/_count
0
répondu 9digitdev 2016-03-03 23:03:17