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?

Shawn Roller
la source

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.

Javanna
la source
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
KenH
la source
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
16

Nous avons créé un petit outil pour ce type de chose https://github.com/taskrabbit/elasticsearch-dump

Evan
la source
6
Les exemples donnés ne couvrent pas la question posée ici. Cela fonctionnera-t-il si nous donnons le fichier json en entrée et l'url de recherche élastique en sortie?
jgr0
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
MosheZada
la source
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

Ram Pratap
la source
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

Greg Dougherty
la source
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.

Gajendra D Ambi
la source
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

Piyush Mittal
la source
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.

MLS
la source
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>
thSoft
la source
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
sudarshan
la source
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

Yaroslav Gaponov
la source
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
waseem khan
la source