json - Error de validación: 1: no se agregaron solicitudes en la indexación masiva ElasticSearch
elasticsearch-bulk-api (2)
La API masiva de Elasticsearch utiliza una sintaxis especial, que en realidad está hecha de documentos json
escritos en líneas individuales. Echa un vistazo a la documentation .
La sintaxis es bastante simple. Para indexar, crear y actualizar necesita 2 documentos json de una sola línea. Las primeras líneas indican la acción, la segunda le da al documento para indexar / crear / actualizar. Para borrar un documento, solo se necesita la línea de acción. Por ejemplo (de la documentación):
{ "index" : { "_index" : "test", "_type" : "type1", "_id" : "1" } }
{ "field1" : "value1" }
{ "create" : { "_index" : "test", "_type" : "type1", "_id" : "3" } }
{ "field1" : "value3" }
{ "update" : {"_id" : "1", "_type" : "type1", "_index" : "index1"} }
{ "doc" : {"field2" : "value2"} }
{ "delete" : { "_index" : "test", "_type" : "type1", "_id" : "2" } }
No olvides finalizar tu archivo con una nueva línea. Luego, para llamar a la api masiva use el comando:
curl -s -XPOST localhost:9200/_bulk --data-binary "@requests"
De la documentación:
Si está proporcionando una entrada de archivo de texto para curl, debe usar el
--data-binary
lugar de plain-d
Tengo un archivo JSON y necesito indexarlo en el servidor ElasticSearch.
El archivo JSOIN se ve así:
{
"sku": "1",
"vbid": "1",
"created": "Sun, 05 Oct 2014 03:35:58 +0000",
"updated": "Sun, 06 Mar 2016 12:44:48 +0000",
"type": "Single",
"downloadable-duration": "perpetual",
"online-duration": "365 days",
"book-format": "ePub",
"build-status": "In Inventory",
"description": "On 7 August 1914, a week before the Battle of Tannenburg and two weeks before the Battle of the Marne, the French army attacked the Germans at Mulhouse in Alsace. Their objective was to recapture territory which had been lost after the Franco-Prussian War of 1870-71, which made it a matter of pride for the French. However, after initial success in capturing Mulhouse, the Germans were able to reinforce more quickly, and drove them back within three days. After forty-three years of peace, this was the first test of strength between France and Germany. In 1929 Karl Deuringer wrote the official history of the battle for the Bavarian Army, an immensely detailed work of 890 pages; First World War expert and former army officer Terence Zuber has translated this study and edited it down to more accessible length, to produce the first account in English of the first major battle of the First World War.",
"publication-date": "07/2014",
"author": "Deuringer, Karl",
"title": "The First Battle of the First World War: Alsace-Lorraine",
"sort-title": "First Battle of the First World War: Alsace-Lorraine",
"edition": "0",
"sampleable": "false",
"page-count": "0",
"print-drm-text": "This title will only allow printing of 2 consecutive pages at a time.",
"copy-drm-text": "This title will only allow copying of 2 consecutive pages at a time.",
"kind": "book",
"fro": "false",
"distributable": "true",
"subjects": {
"subject": [
{
"-schema": "bisac",
"-code": "HIS027090",
"#text": "World War I"
},
{
"-schema": "coursesmart",
"-code": "cs.soc_sci.hist.milit_hist",
"#text": "Social Sciences -> History -> Military History"
}
]
},
"pricelist": {
"publisher-list-price": "0.0",
"digital-list-price": "7.28"
},
"publisher": {
"publisher-name": "The History Press",
"imprint-name": "The History Press Ireland"
},
"aliases": {
"eisbn-canonical": "1",
"isbn-canonical": "1",
"print-isbn-canonical": "9780752460864",
"isbn13": "1",
"isbn10": "0750951796",
"additional-isbns": {
"isbn": [
{
"-type": "print-isbn-10",
"#text": "0752460862"
},
{
"-type": "print-isbn-13",
"#text": "97807524608"
}
]
}
},
"owner": {
"company": {
"id": "1893",
"name": "The History Press"
}
},
"distributor": {
"company": {
"id": "3658",
"name": "asc"
}
}
}
Pero cuando intento indexar este archivo JSON usando el comando
curl -XPOST ''http://localhost:9200/_bulk'' -d @1.json
Me sale este error:
{"error":{"root_cause":[{"type":"action_request_validation_exception","reason":"Validation Failed: 1: no requests added;"}],"type":"action_request_validation_exception","reason":"Validation Failed: 1: no requests added;"},"status":400}
No sé dónde estoy cometiendo un error.
Tuve un problema similar en el sentido de que quería eliminar un documento específico de un tipo específico y, a través de la respuesta anterior, ¡logré que mi simple script de bash funcionara finalmente!
Tengo un archivo que tiene un ID de documento por línea (document_id.txt) y, con el siguiente script de bash, puedo eliminar documentos de cierto tipo con los ID de documento mencionados.
Así es como se ve el archivo:
c476ce18803d7ed3708f6340fdfa34525b20ee90
5131a30a6316f221fe420d2d3c0017a76643bccd
08ebca52025ad1c81581a018febbe57b1e3ca3cd
496ff829c736aa311e2e749cec0df49b5a37f796
87c4101cb10d3404028f83af1ce470a58744b75c
37f0daf7be27cf081e491dd445558719e4dedba1
El script de bash se ve así:
#!/bin/bash
es_cluster="http://localhost:9200"
index="some-index"
doc_type="some-document-type"
for doc_id in `cat document_id.txt`
do
request_string="{/"delete/" : { /"_type/" : /"${doc_type}/", /"_id/" : /"${doc_id}/" } }"
echo -e "${request_string}/r/n/r/n" | curl -s -XPOST "${es_cluster}/${index}/${doc_type}/_bulk" --data-binary @-
echo
done
El truco, después de mucha frustración, fue usar la opción -e para hacer eco y agregar / n / n a la salida de eco antes de que lo coloqué en rizo.
Y luego, en Curl, tengo la opción --data-binary configurada para evitar que elimine el / n / n necesario para el punto final _bulk seguido de la opción @ - ¡ para que lea desde stdin!