2015-10-26 20 views
5

Sto cercando di indicizzare un file JSON in un nuovo indice Elasticsearch e non sono in grado di farlo. Ho i seguenti dati di esempio all'interno del JSONElasticsearch Bulk Index JSON Data

[{"Amount": "480", "Quantity": "2", "Id": "975463711", "Client_Store_sk": "1109"}, 
{"Amount": "2105", "Quantity": "2", "Id": "975463943", "Client_Store_sk": "1109"}, 
{"Amount": "2107", "Quantity": "3", "Id": "974920111", "Client_Store_sk": "1109"}, 
{"Amount": "2115", "Quantity": "2", "Id": "975463798", "Client_Store_sk": "1109"}, 
{"Amount": "2116", "Quantity": "1", "Id": "975463827", "Client_Store_sk": "1109"}, 
{"Amount": "648", "Quantity": "3", "Id": "975464139", "Client_Store_sk": "1109"}, 
{"Amount": "2126", "Quantity": "2", "Id": "975464805", "Client_Store_sk": "1109"}, 
{"Amount": "2133", "Quantity": "1", "Id": "975464061", "Client_Store_sk": "1109"}, 
{"Amount": "1339", "Quantity": "4", "Id": "974919458", "Client_Store_sk": "1109"}, 
{"Amount": "1196", "Quantity": "5", "Id": "974920538", "Client_Store_sk": "1109"}, 
{"Amount": "1198", "Quantity": "4", "Id": "975463638", "Client_Store_sk": "1109"}, 
{"Amount": "1345", "Quantity": "4", "Id": "974919522", "Client_Store_sk": "1109"}, 
{"Amount": "1347", "Quantity": "2", "Id": "974919563", "Client_Store_sk": "1109"}, 
{"Amount": "673", "Quantity": "2", "Id": "975464359", "Client_Store_sk": "1109"}, 
{"Amount": "2153", "Quantity": "1", "Id": "975464511", "Client_Store_sk": "1109"}, 
{"Amount": "3896", "Quantity": "4", "Id": "977289342", "Client_Store_sk": "1109"}, 
{"Amount": "3897", "Quantity": "4", "Id": "974920602", "Client_Store_sk": "1109"}] 

Quando provo ad utilizzare l'API indice di massa standard dal elasticsearch ottengo questo errore errore: { "message": "ActionRequestValidationException [Convalida non riuscita: 1: nessuna richiesta aggiunto;] "}

Qualcuno può aiutare con l'indicizzazione di questo tipo di JSON?

+0

mi puoi dire la richiesta di indice che si stanno usando –

+0

@KumarKailash qui è richiesta arricciatura -XPOST localhost: 9200/index_local/my_doc_type/_bulk --data-binary --data @/home/data1.json –

risposta

9

Quello che devi fare è leggere quel file JSON e quindi creare una richiesta di massa con il formato previsto dallo _bulk endpoint, cioè una riga per il comando e una linea per il documento, separati da un carattere di nuova riga ... sciacquare e ripetere per ogni documento:

curl -XPOST localhost:9200/your_index/_bulk -d ' 
{"index": {"_index": "your_index", "_type": "your_type", "_id": "975463711"}} 
{"Amount": "480", "Quantity": "2", "Id": "975463711", "Client_Store_sk": "1109"} 
{"index": {"_index": "your_index", "_type": "your_type", "_id": "975463943"}} 
{"Amount": "2105", "Quantity": "2", "Id": "975463943", "Client_Store_sk": "1109"} 
... etc for all your documents 
' 

Basta fare in modo di sostituire your_index e your_type con i nomi di indice e tipo effettivo che si sta utilizzando.

UPDATE

Si noti che la riga di comando può essere abbreviato, rimuovendo _index e _type se questi sono specificati nel tuo URL. È anche possibile rimuovere _id se si specifica lo path to your id field nella mappatura (si noti che questa funzionalità sarà deprecata in ES 2.0, tuttavia). Per lo meno, la riga di comando può sembrare {"index":{}} per tutti i documenti, ma sarà sempre obbligatoria al fine di specificare quale tipo di operazione che si desidera eseguire (in questo caso index documento)

UPDATE 2

curl -XPOST localhost:9200/index_local/my_doc_type/_bulk --data-binary @/home/data1.json 

/home/data1.json dovrebbe essere simile a questo:

{"index":{}} 
{"Amount": "480", "Quantity": "2", "Id": "975463711", "Client_Store_sk": "1109"} 
{"index":{}} 
{"Amount": "2105", "Quantity": "2", "Id": "975463943", "Client_Store_sk": "1109"} 
{"index":{}} 
{"Amount": "2107", "Quantity": "3", "Id": "974920111", "Client_Store_sk": "1109"} 
+0

Ricevo il formato che hai menzionato, ma volevo chiedere se posso avere una soluzione in modo che non debba specificare qualcosa come questo "indice": {"_index": "your_index", "_type": "your_type", "_id": "975463711"}} dopo ogni documento in json? –

+0

La riga di comando è sempre obbligatoria per ogni documento. Se si aggiunge l'indice e il nome del tipo nell'URL (ad esempio 'localhost: 9200/your_index/your_type/_bulk'), è possibile rimuovere' _index' e '_type' dalla riga di comando per accorciarlo. C'è anche un modo per non dover specificare '_id', ma per lo meno devi sempre specificare l'operazione che vuoi eseguire con il documento, ovvero il più breve che puoi fare è' {"index": {} } ' – Val

+0

Quindi la richiesta curl -XPOST localhost: 9200/index_local/my_doc_type/_bulk --data-binary --data @/home/data1.json dove ho specificato l'indice e doc_type nella richiesta, i miei dati json dovrebbero Assomiglia a questo?[{"indice": {}} {"Importo": "480", "Quantità": "2", "Id": "975463711", "Client_Store_sk": "1109"}, {"indice": {}} {"Quantità": "2105", "Quantità": "2", "Id": "975463943", "Client_Store_sk": "1109"}, {"indice": {}} {" Importo ":" 2107 "," Quantità ":" 3 "," Id ":" 974920111 "," Client_Store_sk ":" 1109 "} ] –

2

a partire da oggi, 6.1.2 è l'ultima versione di elasticsearch, e il comando ricciolo che funziona per me su Windows (x64) è

curl -s -XPOST localhost:9200/my_index/my_index_type/_bulk -H "Content-Type: 
application/x-ndjson" --data-binary @D:\data\mydata.json 

Il formato dei dati che dovrebbe essere presente in mydata.json rimane la stessa, come mostrato nella risposta @ di val