Cliente Elasticsearch para Node.js: @elastic/elasticsearch

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Cliente Elasticsearch para JavaScript (Node.js) — @elastic/elasticsearch

\n\n

Elasticsearch es un potente sistema de búsqueda y análisis distribuido, construido sobre Apache Lucene. Permite realizar búsquedas de texto completo, agregación de datos y análisis de registros en tiempo real. Para interactuar con Elasticsearch desde aplicaciones Node.js, existe el cliente oficial — @elastic/elasticsearch. Proporciona una API conveniente para todas las operaciones: desde la conexión al clúster hasta consultas de búsqueda complejas.

\n\n

La biblioteca es totalmente compatible con todas las versiones de Elasticsearch 7.x y 8.x, funciona de forma asíncrona con promesas y es ideal para construir servicios de búsqueda, análisis y monitoreo de alta carga. En este artículo, veremos la instalación, configuración básica y operaciones principales con datos usando Node.js.

\n\n

Instalación y conexión

\n\n

La instalación del cliente se realiza a través del gestor de paquetes npm:

\n\n
npm install @elastic/elasticsearch
\n\n

Después de la instalación, es necesario crear una instancia del cliente, especificando la dirección del servidor Elasticsearch y, si es necesario, los parámetros de autenticación:

\n\n
const { Client } = require('@elastic/elasticsearch');\n\nconst client = new Client({\n  node: 'http://localhost:9200',\n  auth: {\n    username: 'elastic',\n    password: 'changeme'\n  }\n});
\n\n

Para trabajar con el servicio en la nube Elastic Cloud, se utilizan los parámetros cloud.id y auth.apiKey.

\n\n

Trabajo con índices

\n\n

Un índice en Elasticsearch es el equivalente a una base de datos en los sistemas de gestión de bases de datos relacionales. Veamos las operaciones principales.

\n\n

Creación de un índice

\n\n
async function createIndex() {\n  const response = await client.indices.create({\n    index: 'products',\n    body: {\n      settings: {\n        number_of_shards: 1,\n        number_of_replicas: 1\n      },\n      mappings: {\n        properties: {\n          title: { type: 'text' },\n          description: { type: 'text' },\n          price: { type: 'float' },\n          created_at: { type: 'date' }\n        }\n      }\n    }\n  });\n  console.log('Índice creado:', response);\n}
\n\n

Eliminación de un índice

\n\n
async function deleteIndex() {\n  await client.indices.delete({ index: 'products' });\n  console.log('Índice eliminado');\n}
\n\n

Adición y actualización de documentos

\n\n

Un documento es la unidad básica de datos en Elasticsearch. Agreguemos algunos registros al índice products:

\n\n
async function addDocuments() {\n  const doc1 = {\n    title: 'Portátil Apple MacBook Pro',\n    description: 'Portátil potente para desarrolladores y diseñadores',\n    price: 2499.99,\n    created_at: new Date()\n  };\n\n  const doc2 = {\n    title: 'Teclado mecánico Logitech',\n    description: 'Teclado inalámbrico con retroiluminación',\n    price: 149.99,\n    created_at: new Date()\n  };\n\n  // Adición con ID especificado\n  await client.index({\n    index: 'products',\n    id: '1',\n    body: doc1\n  });\n\n  // Adición sin ID (generación automática)\n  await client.index({\n    index: 'products',\n    body: doc2\n  });\n\n  // Escritura forzada en disco\n  await client.indices.refresh({ index: 'products' });\n}
\n\n

Para la actualización parcial se utiliza el método update:

\n\n
await client.update({\n  index: 'products',\n  id: '1',\n  body: {\n    doc: {\n      price: 2399.99\n    }\n  }\n});
\n\n

Búsqueda de datos

\n\n

Elasticsearch proporciona un potente DSL para construir consultas. Veamos algunos ejemplos.

\n\n

Búsqueda de texto completo

\n\n
async function searchProducts(query) {\n  const response = await client.search({\n    index: 'products',\n    body: {\n      query: {\n        match: {\n          description: query\n        }\n      }\n    }\n  });\n\n  console.log('Documentos encontrados:', response.hits.total.value);\n  response.hits.hits.forEach                    

Recommendations