Importa / indicizza un file JSON in Elasticsearch


89

Sono nuovo in Elasticsearch e fino a questo punto ho inserito i dati manualmente. Ad esempio, ho fatto qualcosa del genere:

$ curl -XPUT 'http://localhost:9200/twitter/tweet/1' -d '{
    "user" : "kimchy",
    "post_date" : "2009-11-15T14:12:12",
    "message" : "trying out Elastic Search"
}'

Ora ho un file .json e voglio indicizzarlo in Elasticsearch. Anch'io ho provato qualcosa di simile, ma senza successo:

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

Come si importa un file .json? Ci sono passaggi che devo eseguire prima per assicurarmi che la mappatura sia corretta?


Risposte:


88

Il comando giusto se vuoi usare un file con curl è questo:

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

Elasticsearch è privo di schemi, quindi non è necessariamente necessaria una mappatura. Se invii il json così com'è e utilizzi la mappatura predefinita, ogni campo verrà indicizzato e analizzato utilizzando l' analizzatore standard .

Se vuoi interagire con Elasticsearch tramite la riga di comando, potresti voler dare un'occhiata a elasticshell che dovrebbe essere un po 'più maneggevole di curl.

2019-07-10: Va notato che i tipi di mappatura personalizzata sono deprecati e non devono essere utilizzati. Ho aggiornato il tipo nell'URL sopra per rendere più facile vedere quale era l'indice e quale era il tipo poiché avere entrambi i nomi "test" era fonte di confusione.


1
Non funziona per me, quando digito il tuo comando la console non fornisce alcun dato.
Konrad

2
@Konrad è stata sostituita jfblouvmlxecs01con localhost, giusto?
Ehtesh Choudhury

2
clwen - la "@" dice a curl di caricare i dati dal file json.
Oliver

1
ciao sono anche nuovo nella ricerca elastica qualcuno può per favore indicarmi dove archiviare questi file .json?
Swaheed

2
Dove memorizzare il file JSON?
AV94

26

Secondo la documentazione corrente, https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html :

Se stai fornendo l'input del file di testo a curl, devi usare il flag --data-binary invece del semplice -d. Quest'ultimo non conserva le nuove righe.

Esempio:

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

1
Notare che il file json _bulk load non è un file json valido; la sintassi è fornita nel collegamento API _bulk. Inoltre, non è necessario fornire un _id come indicato in questi esempi; quando _id viene omesso verrà fornito un _id generato automaticamente.
Steve Tarver


11

Sono l'autore di elasticsearch_loader
ho scritto ESL per questo problema esatto.

Puoi scaricarlo con pip:

pip install elasticsearch-loader

E poi sarai in grado di caricare i file json in elasticsearch emettendo:

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

Questo è carino! Aggiunge la indexriga obbligatoria prima di ogni documento.
dr0i

2018-10-04 11: 51: 40.395741 ERRORE tentativo [1/1] ha ricevuto un'eccezione, si tratta di una perdita di dati permanente, nessun nuovo tentativo 2018-10-04 11: 51: 40.395741 WARN Il blocco 0 ha ottenuto un'eccezione (ConnectionTimeout causato da - ReadTimeoutError (HTTPConnectionPool (host = 'localhost', port = 9200): lettura scaduta. (Lettura timeout = 10.0))) durante l'elaborazione
Chiel

A parte il fatto che non funziona, dove specifichi l'URL e la porta?
Chiel

È possibile visitare la pagina GitHub o eseguire elasticsearch_loader --helpper visualizzare il messaggio di aiuto completo. È possibile specificare l'host: porta con--es-host http://hostname:port
MosheZada

Bello. Tranne che --typediventa ridondante poiché Elasticsearch rimuove i tipi nella versione 6 elastic.co/guide/en/elasticsearch/reference/6.0/…
Vlad T.

8

In aggiunta alla risposta di KenH

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

Puoi sostituire @requestscon@complete_path_to_json_file

Nota: @è importante prima del percorso del file


puoi dare qualche esempio per il percorso. Sto dando "@c: \ accounts.json" e lo metto lì anche allora, non è in grado di individuarlo
Piyush Mittal

4
dovrebbe essere @ "c: \ accounts.json"
Ram Pratap

8

Una cosa che non ho visto nessuno menzionare: il file JSON deve avere una riga che specifica l'indice a cui appartiene la riga successiva, per ogni riga del file JSON "puro".

IE

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

Senza quello, niente funziona e non ti dirà perché


7

Mi sono solo assicurato di trovarmi nella stessa directory del file json e quindi ho semplicemente eseguito questo

curl -s -H "Content-Type: application/json" -XPOST localhost:9200/product/default/_bulk?pretty --data-binary @product.json

Quindi, se anche tu assicurati di essere nella stessa directory ed eseguilo in questo modo. Nota: product / default / nel comando è qualcosa di specifico per il mio ambiente. puoi ometterlo o sostituirlo con qualsiasi cosa sia rilevante per te.



5

Tu stai usando

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

Se "richieste" è un file json, devi cambiarlo in

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

Ora prima di questo, se il tuo file json non è indicizzato, devi inserire una riga di indice prima di ogni riga all'interno del file json. Puoi farlo con JQ. Fare riferimento al collegamento seguente: http://kevinmarsh.com/2014/10/23/using-jq-to-import-json-into-elasticsearch.html

Vai ai tutorial di elasticsearch (ad esempio il tutorial di shakespeare) e scarica il file json di esempio utilizzato e dai un'occhiata. Davanti a ogni oggetto json (ogni singola riga) c'è una linea di indice. Questo è quello che stai cercando dopo aver usato il comando jq. Questo formato è obbligatorio per utilizzare l'API in blocco, i file json normali non funzioneranno.


1

A partire da Elasticsearch 7.7, è necessario specificare anche il tipo di contenuto:

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

0

se stai usando VirtualBox e UBUNTU in esso o stai semplicemente usando UBUNTU allora può essere 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

Ho scritto del codice per esporre l'API Elasticsearch tramite un'API del file system.

Ad esempio, è una buona idea per esportare / importare chiaramente i dati.

Ho creato un prototipo di elastici . Si basa su FUSE

demo


0
  • Se stai utilizzando la ricerca elastica 7.7 o versione successiva, segui il comando seguente.

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

  • Sul percorso del file sopra è /Users/waseem.khan/waseem/elastic/account.json.

  • Se stai usando la versione 6.x di ricerca elastica, puoi usare il comando seguente.

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

Nota : assicurati che nel tuo file .json alla fine aggiungerai l'unica riga vuota altrimenti otterrai un'eccezione sotto.

"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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.