Quiero usar el índice masivo de Elasticsearch con JavaScript y seguir el documento oficial . Básicamente, solo lo usé tal cual, pero arroja una excepción que dice que la solicitud masiva debe finalizar con un código de nueva línea, que parece ser líneas JSON. Mi pregunta es, si es así, ¿cómo puedo convertir las líneas JSON a JSON y luego pasarlas a la API masiva? ¿O me faltan algunas opciones al llamar a client.bulk?
ResponseError: illegal_argument_exception: [illegal_argument_exception] Reason: The bulk request must be terminated by a newline [\n] at SniffingTransport.requestUso Elasticsearch v7.15 y Node.js v16.15 en macOS.
Secundo esto. Estoy usando 8.2 y no funciona. Seguí el ejemplo exactamente y todavía arroja el error de nueva línea.
Solía poder pasar la operación seguida del documento en una matriz y funcionaría bien, pero parece haber sido "actualizado" para peor.
Seguiré probando a ver si se me ocurre algo.
EDITAR: OK. Encontré algo que funciona para mí y espero que funcione para usted también.
Hice un cliente secundario para reutilizar la conexión. Es bastante sencillo, pero aquí está el enlace: https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/child.html
Modifiqué los encabezados de aceptación y tipo de contenido para ese cliente y el código para configurar el cliente se ve así:
const es = require('@elastic/elasticsearch'); const es_hosts = [ 'https://elastic_host1', 'https://elastic_host2' ]; const es_client = new es.Client({ node: es_hosts }); const es_bulk = es_client.child({ headers: { 'accept': 'application/json', 'content-type': 'application/json' } })Supongo que está pasando una matriz que tiene una operación y un documento. Convertiremos esa matriz en lo que equivale a ser una cadena grande, recordando agregar la nueva línea.
let bulk_data = [ { index: { _index: 'my-index' } }, { id: 1, name: 'dave', job: 'janitor' } } ] let bulk_body = { body: bulk_data.map(JSON.stringify).join('\n') + '\n' } const results = await es_bulk.bulk(bulk_body);Déjeme saber si esto ayuda.