Importer / indexer un fichier JSON dans Elasticsearch
Je suis nouveau sur Elasticsearch et j'ai entré des données manuellement jusqu'à ce point. Par exemple j'ai fait quelque chose comme ceci:
$ curl -XPUT 'http://localhost:9200/twitter/tweet/1' -d '{
"user" : "kimchy",
"post_date" : "2009-11-15T14:12:12",
"message" : "trying out Elastic Search"
}'
J'ai maintenant un .fichier json et je veux indexer cela dans Elasticsearch. J'ai essayé quelque chose comme ça aussi, mais pas de succès:
curl -XPOST 'http://jfblouvmlxecs01:9200/test/test/1' -d lane.json
Comment puis-je importer un .fichier json? Y a-t-il des mesures que je dois prendre en premier pour m'assurer que le mappage est correct?
10 réponses
La bonne commande si vous voulez utiliser un fichier avec curl est la suivante:
curl -XPOST 'http://jfblouvmlxecs01:9200/test/test/1' -d @lane.json
Elasticsearch est schemaless, donc vous n'avez pas nécessairement besoin d'un mappage. Si vous envoyez le json tel quel et que vous utilisez le mappage par défaut, chaque champ sera indexé et analysé à l'aide de analyseur standard.
Si vous voulez interagir avec Elasticsearch via la ligne de commande, vous pouvez jeter un oeil à elasticshell qui devrait être un peu plus pratique que curl.
Selon les documents actuels, http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-bulk.html :
Si vous fournissez une entrée de fichier texte à curl, vous devez -- drapeau data-binary au lieu de plain-D. Ce dernier ne conserve pas les retours à la ligne.
Exemple:
$ curl -s -XPOST localhost:9200/_bulk --data-binary @requests
, Nous avons fait un petit outil pour ce genre de chose https://github.com/taskrabbit/elasticsearch-dump
Ajouter à la réponse de KenH
$ curl -s -XPOST localhost:9200/_bulk --data-binary @requests
, Vous pouvez remplacer @requests
avec @complete_path_to_json_file
Remarque: @
est important avant le chemin du fichier
Juste obtenir facteur de https://www.getpostman.com/docs/environments Donnez-lui l'emplacement du fichier avec / test / test / 1 / _bulk?jolie commande.
Vous utilisez
$ curl -s -XPOST localhost:9200/_bulk --data-binary @requests
Si 'requests' est un fichier json, vous devez le changer en
$ curl -s -XPOST localhost:9200/_bulk --data-binary @requests.json
Maintenant, avant cela, si votre fichier json n'est pas indexé, vous devez insérer un index de la ligne avant chaque ligne dans le fichier json. Vous pouvez le faire avec JQ. Consultez ci-dessous le lien: http://kevinmarsh.com/2014/10/23/using-jq-to-import-json-into-elasticsearch.html
Allez dans les tutoriels elasticsearch (exemple le tutoriel shakespeare) et téléchargez l'exemple de fichier JSON utilisé et avoir un coup d'oeil. Devant chaque objet json (chaque ligne individuelle), il y a une ligne d'index. C'est ce que vous recherchez après avoir utilisé la commande jq. Ce format est obligatoire pour utiliser L'API en vrac, les fichiers JSON simples ne fonctionneront pas.
Je suis l'auteur de elasticsearch_loader
J'ai écrit ESL pour ce problème exact.
Vous pouvez le télécharger avec pip:
pip install elasticsearch-loader
Et puis vous serez en mesure de charger des fichiers json dans elasticsearch en émettant:
elasticsearch_loader --index incidents --type incident json file1.json file2.json
Une chose que je n'ai vu personne mentionner: le fichier JSON doit avoir une ligne spécifiant l'index auquel appartient la ligne suivante, pour chaque ligne du fichier JSON "pur".
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"}
Sans cela, rien ne fonctionne, et il ne vous dira pas pourquoi
Si vous utilisez VirtualBox et UBUNTU ou si vous utilisez simplement UBUNTU, cela peut être utile
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
Je me suis juste assuré que je suis dans le même répertoire que le fichier json, puis j'ai simplement exécuté ce
curl -s -H "Content-Type: application/json" -XPOST localhost:9200/product/default/_bulk?pretty --data-binary @product.json
Donc, si vous aussi, assurez-vous que vous êtes dans le même répertoire et exécuter de cette façon. Remarque: produit// par défaut dans la commande est quelque chose de spécifique à mon environnement. vous pouvez l'omettre ou le remplacer par tout ce qui vous concerne.