Importer / Indexer un fichier JSON dans Elasticsearch


89

Je suis nouveau sur Elasticsearch et j'ai saisi des données manuellement jusqu'à présent. 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 l'indexer dans Elasticsearch. J'ai essayé quelque chose comme ça aussi, mais sans succès:

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

Comment importer un fichier .json? Dois-je prendre des mesures en premier pour m'assurer que le mappage est correct?


Réponses:


88

La bonne commande si vous souhaitez utiliser un fichier avec curl est la suivante:

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

Elasticsearch est sans schéma, vous n'avez donc 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 l' analyseur standard .

Si vous souhaitez interagir avec Elasticsearch via la ligne de commande, vous pouvez consulter le elasticshell qui devrait être un peu plus pratique que curl.

2019-07-10: Il convient de noter que les types de mappage personnalisés sont obsolètes et ne doivent pas être utilisés. J'ai mis à jour le type dans l'url ci-dessus pour qu'il soit plus facile de voir quel était l'index et quel était le type, car les deux étaient nommés "test" était déroutant.


1
Je ne travaille pas pour moi, lorsque je tape votre commande, la console ne fournit aucune donnée.
Konrad

2
@Konrad vous avez remplacé jfblouvmlxecs01par localhost, non?
Ehtesh Choudhury

2
clwen - le "@" indique à curl de charger les données du fichier json.
Oliver

1
Salut, je suis également nouveau dans la recherche élastique est-ce que n'importe qui peut s'il vous plaît me gudie où stocker ces fichiers .json?
swaheed

2
Où stocker le fichier json?
AV94

26

Selon la documentation actuelle, https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html :

Si vous fournissez une entrée de fichier texte à curl, vous devez utiliser l'indicateur --data-binary au lieu de plain -d. Ce dernier ne préserve pas les nouvelles lignes.

Exemple:

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

1
Notez que le fichier json de chargement _bulk n'est pas un fichier json valide; la syntaxe est fournie dans le lien API _bulk. De plus, vous n'êtes pas obligé de fournir un _id comme indiqué dans ces exemples; un _id généré automatiquement sera fourni lorsque _id est omis.
Steve Tarver


11

Je suis l'auteur de elasticsearch_loader,
j'ai écrit ESL pour ce problème précis.

Vous pouvez le télécharger avec pip:

pip install elasticsearch-loader

Et puis vous pourrez charger des fichiers json dans elasticsearch en émettant:

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

C'est sympa! Il ajoute la indexligne obligatoire avant chaque document.
dr0i

2018-10-04 11: 51: 40.395741 La tentative d'ERREUR [1/1] a obtenu une exception, il s'agit d'une perte de données permanente, plus aucune nouvelle tentative. - ReadTimeoutError (HTTPConnectionPool (host = 'localhost', port = 9200): Lecture expirée. (Read timeout = 10.0))) pendant le traitement
Chiel

Outre le fait que cela ne fonctionne pas, où spécifiez-vous l'URL et le port?
Chiel

Vous pouvez visiter la page GitHub ou exécuter elasticsearch_loader --helppour afficher le message d'aide complet. Vous pouvez spécifier l'hôte: port avec--es-host http://hostname:port
MosheZada

Agréable. Sauf que cela --typedevient redondant car Elasticsearch supprime les types dans la version 6 élastique.co
Vlad T.

8

Ajout à la réponse de KenH

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

Vous pouvez remplacer @requestspar@complete_path_to_json_file

Remarque: @est important avant le chemin du fichier


pouvez-vous donner un exemple pour le chemin. Je donne "@c: \ accounts.json" et je le place là même alors, ce n'est pas en mesure de le localiser
Piyush Mittal

4
il devrait être @ "c: \ accounts.json"
Ram Pratap

8

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

C'EST À DIRE

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

Sans ça, rien ne fonctionne, et ça ne te dira pas pourquoi


7

Je viens de m'assurer que je suis dans le même répertoire que le fichier json, puis je l'ai simplement exécuté

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écutez-le de cette façon. Remarque: product / default / dans la commande est quelque chose de spécifique à mon environnement. vous pouvez l'omettre ou le remplacer par tout ce qui vous concerne.


6

il suffit d'obtenir postman sur https://www.getpostman.com/docs/environments, donnez-lui l'emplacement du fichier avec la commande / test / test / 1 / _bulk? pretty. entrez la description de l'image ici


2
{"error": "no handler found for uri [/ test / test / 1 / _bulk? pretty] and method [POST]"}
Chiel

{"error": "L'en-tête Content-Type [text / plain] n'est pas pris en charge", "status": 406}
X. L

5

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 une ligne d'index avant chaque ligne à l'intérieur du fichier json. Vous pouvez le faire avec JQ. Reportez-vous au lien ci-dessous: http://kevinmarsh.com/2014/10/23/using-jq-to-import-json-into-elasticsearch.html

Accédez aux didacticiels elasticsearch (exemple le didacticiel shakespeare) et téléchargez l'exemple de fichier json utilisé et jetez-y un œil. 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 bloc, les fichiers json simples ne fonctionneront pas.


1

Depuis Elasticsearch 7.7, vous devez également spécifier le type de contenu:

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

0

si vous utilisez VirtualBox et UBUNTU dedans 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

0

J'ai écrit du code pour exposer l'API Elasticsearch via une API Filesystem.

C'est une bonne idée pour une exportation / importation claire des données par exemple.

J'ai créé un prototype de pilote élastique . Il est basé sur FUSE

démo


0
  • Si vous utilisez la version 7.7 ou supérieure de la recherche élastique, suivez la commande ci-dessous.

    curl -H "Content-Type: application/json" -XPOST "localhost:9200/bank/_bulk? pretty&refresh" --data-binary @"/Users/waseem.khan/waseem/elastic/account.json"

  • Le chemin du fichier ci-dessus est /Users/waseem.khan/waseem/elastic/account.json.

  • Si vous utilisez la version 6.x de la recherche élastique, vous pouvez utiliser la commande ci-dessous.

curl -X POST localhost:9200/bank/_bulk?pretty&refresh --data-binary @"/Users/waseem.khan/waseem/elastic/account.json" -H 'Content-Type: application/json'

Remarque : assurez-vous que dans votre fichier .json à la fin, vous ajouterez une ligne vide, sinon vous obtiendrez l'exception ci-dessous.

"error" : {
"root_cause" : [
  {
    "type" : "illegal_argument_exception",
    "reason" : "The bulk request must be terminated by a newline [\n]"
  }
],
"type" : "illegal_argument_exception",
"reason" : "The bulk request must be terminated by a newline [\n]"
},
`enter code here`"status" : 400
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.