Cliente Elasticsearch para JavaScript (Node.js) — @elastic/elasticsearch
\n\nElasticsearch é um poderoso sistema de busca e análise distribuído, construído sobre o Apache Lucene. Ele permite realizar busca em texto completo, agregação de dados e análise de logs em tempo real. Para interagir com o Elasticsearch a partir de aplicações Node.js, existe o cliente oficial — @elastic/elasticsearch. Ele fornece uma API conveniente para todas as operações: desde a conexão ao cluster até consultas de busca complexas.
A biblioteca suporta totalmente todas as versões do Elasticsearch 7.x e 8.x, funciona de forma assíncrona com promessas e é ideal para construir serviços de busca, análise e monitoramento de alta carga. Neste artigo, veremos a instalação, configuração básica e operações principais com dados usando Node.js.
\n\nInstalação e conexão
\n\nA instalação do cliente é feita através do gerenciador de pacotes npm:
\n\nnpm install @elastic/elasticsearch\n\nApós a instalação, é necessário criar uma instância do cliente, informando o endereço do servidor Elasticsearch e, se necessário, os parâmetros de autenticação:
\n\nconst { 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\nPara trabalhar com o serviço em nuvem Elastic Cloud, use o parâmetro cloud.id e auth.apiKey.
Trabalhando com índices
\n\nUm índice no Elasticsearch é análogo a um banco de dados em SGBDs relacionais. Vamos ver as operações principais.
\n\nCriação de índice
\n\nasync 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 criado:', response);\n}\n\nExclusão de índice
\n\nasync function deleteIndex() {\n await client.indices.delete({ index: 'products' });\n console.log('Índice excluído');\n}\n\nAdicionando e atualizando documentos
\n\nUm documento é a unidade básica de dados no Elasticsearch. Vamos adicionar alguns registros ao índice products:
async function addDocuments() {\n const doc1 = {\n title: 'Notebook Apple MacBook Pro',\n description: 'Notebook potente para desenvolvedores e designers',\n price: 2499.99,\n created_at: new Date()\n };\n\n const doc2 = {\n title: 'Teclado mecânico Logitech',\n description: 'Teclado sem fio com iluminação',\n price: 149.99,\n created_at: new Date()\n };\n\n // Adicionando com ID especificado\n await client.index({\n index: 'products',\n id: '1',\n body: doc1\n });\n\n // Adicionando sem ID (geração automática)\n await client.index({\n index: 'products',\n body: doc2\n });\n\n // Gravação forçada no disco\n await client.indices.refresh({ index: 'products' });\n}\n\nPara atualização parcial, use o método update:
await client.update({\n index: 'products',\n id: '1',\n body: {\n doc: {\n price: 2399.99\n }\n }\n});\n\nBusca de dados
\n\nO Elasticsearch fornece uma DSL poderosa para construir consultas. Vejamos alguns exemplos.
\n\nBusca em texto completo
\n\nasync 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