Pourquoi Node.js avec Elasticsearch : guide pratique ?
Le développement web moderne exige une gestion efficace des données en temps réel, et Elasticsearch est un outil idéal pour cela. En utilisant Node.js comme langage de programmation côté serveur, vous pouvez intégrer facilement Elasticsearch pour aider à gérer les volumes importants de données.
Un cas d'usage concret : Imaginez une application e-commerce avec des milliers de produits à indexer et rechercher rapidement. Utiliser Node.js et Elasticsearch permettrait de fournir une recherche instantanée, d'améliorer la performance globale de l'application et d'offrir une meilleure expérience utilisateur.
Prerequis
Voici les connaissances nécessaires et les outils à installer :
Connaissances :
- Node.js (v14 ou plus)
- NPM (Node Package Manager) pour gérer les dépendances
- Elasticsearch (v7 ou plus)
Outils à installer :
- Installez Node.js via le site officiel https://nodejs.org/
- Installez Elasticsearch via Docker :
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7
Concepts fondamentaux
1. Installation et configuration d'Elasticsearch
Avant de commencer, nous devons installer et configurer Elasticsearch.
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7
2. Installation de elasticsearch.js
Nous allons utiliser le client Elasticsearch pour Node.js pour interagir avec notre instance d'Elasticsearch.
npm install elasticsearch
3. Connexion à Elasticsearch
Créez un fichier app.js et ajoutez le code suivant pour vous connecter à votre instance d'Elasticsearch :
const { Client } = require('@elastic/elasticsearch');
const client = new Client({ node: 'http://localhost:9200' });
async function run() {
try {
const response = await client.ping({
requestTimeout: 3000,
});
console.log('pong', response);
} catch (error) {
console.error(error);
}
}
run();
4. Création d'un index
Maintenant, créons un index pour stocker nos données.
async function createIndex() {
try {
const response = await client.indices.create({
index: 'tasks',
});
console.log('Index created:', response);
} catch (error) {
console.error(error);
}
}
createIndex();
5. Ajout de documents
Ajoutons quelques documents à notre index.
async function addDocuments() {
try {
const tasks = [
{ title: 'Task 1', description: 'Description for task 1' },
{ title: 'Task 2', description: 'Description for task 2' },
];
const bulkBody = tasks.flatMap(task => [
{ index: { _index: 'tasks', _id: task.title } },
task,
]);
const response = await client.bulk({ body: bulkBody });
console.log('Documents added:', response);
} catch (error) {
console.error(error);
}
}
addDocuments();
6. Recherche de documents
Enfin, cherchons les documents dans notre index.
async function searchDocuments(query) {
try {
const response = await client.search({
index: 'tasks',
body: {
query: { match: { title: query } },
},
});
console.log('Search results:', response.body.hits.hits);
} catch (error) {
console.error(error);
}
}
searchDocuments('Task');
Mise en pratique : projet fil rouge
Nous allons créer un mini-projet complet et réaliste. Voici comment structurer le projet :
- Initialisation du projet
- Installation des dépendances
- Création de l'index
- Ajout de documents
- Recherche de documents
1. Initialisation du projet
mkdir elasticsearch-nodejs-app
cd elasticsearch-nodejs-app
npm init -y
2. Installation des dépendances
npm install elasticsearch express body-parser
3. Création de l'index
Créez un fichier app.js et ajoutez le code suivant :
const { Client } = require('@elastic/elasticsearch');
const express = require('express');
const bodyParser = require('body-parser');
const client = new Client({ node: 'http://localhost:9200' });
const app = express();
app.use(bodyParser.json());
async function createIndex() {
try {
const response = await client.indices.create({
index: 'tasks',
});
console.log('Index created:', response);
} catch (error) {
console.error(error);
}
}
createIndex();
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
4. Ajout de documents
Ajoutez une route pour ajouter des documents :
app.post('/tasks', async (req, res) => {
try {
const { title, description } = req.body;
const response = await client.index({
index: 'tasks',
body: { title, description },
});
res.status(201).json(response);
} catch (error) {
console.error(error);
res.status(500).json({ error: 'Failed to add task' });
}
});
5. Recherche de documents
Ajoutez une route pour rechercher des documents :
app.get('/tasks', async (req, res) => {
try {
const { query } = req.query;
const response = await client.search({
index: 'tasks',
body: {
query: { match: { title: query } },
},
});
res.json(response.body.hits.hits);
} catch (error) {
console.error(error);
res.status(500).json({ error: 'Failed to search tasks' });
}
});
Commandes à exécuter
node app.js
Erreurs frequentes et debugging
Erreur :
client.indices.createéchoue avec un message d'erreur// Mauvais client.indices.create({ index: 'tasks' }); // Correct client.indices.create({ index: 'tasks', ignore: [400] });Erreur :
client.indexéchoue avec un message d'erreur// Mauvais client.index({ index: 'tasks', body: { title: 'Task 1' } }); // Correct try { const response = await client.index({ index: 'tasks', body: { title: 'Task 1' }, }); console.log('Document added:', response); } catch (error) { console.error(error); }Erreur :
client.searchéchoue avec un message d'erreur// Mauvais client.search({ index: 'tasks', body: { query: { match: { title: 'Task' } } } }); // Correct try { const response = await client.search({ index: 'tasks', body: { query: { match: { title: 'Task' } } }, }); console.log('Search results:', response.body.hits.hits); } catch (error) { console.error(error); }
Pour aller plus loin
- Utilisation de
elasticsearch-helperspour simplifier les opérations - Intégration avec MongoDB pour une gestion des données côté serveur
- Créer une API REST complète avec Express
Défi pratique : Ajoutez une fonctionnalité pour mettre à jour et supprimer des documents dans l'index Elasticsearch.