Nouveau : Datasets open source gratuits disponibles !Decouvrir →
🟢
Intermediaire 30 min Node.js

Node.js avec Elasticsearch : guide pratique

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 :

  1. Initialisation du projet
  2. Installation des dépendances
  3. Création de l'index
  4. Ajout de documents
  5. 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

  1. Erreur : client.indices.create échoue avec un message d'erreur

    // Mauvais
    client.indices.create({ index: 'tasks' });
    
    // Correct
    client.indices.create({ index: 'tasks', ignore: [400] });
    
  2. 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);
    }
    
  3. 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

  1. Utilisation de elasticsearch-helpers pour simplifier les opérations
  2. Intégration avec MongoDB pour une gestion des données côté serveur
  3. 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.

Besoin d'aide sur Node.js ?

Besoin d'aide sur un projet technique ? Decrivez-le pour des conseils personnalises.

Recevoir des conseils

Questions frequentes

Comment installer Node.js sur mon système?
Vous pouvez installer Node.js via le gestionnaire de paquets de votre système d'exploitation ou en téléchargeant directement le binaire depuis le site officiel de Node.js.
Quelle est l'intégration la plus simple entre Node.js et Elasticsearch?
L'intégration la plus simple est d'utiliser les bibliothèques npm pour Node.js comme 'elasticsearch' qui vous permet de créer des clients facilement et d'interagir avec votre cluster Elasticsearch.
Comment gérer les erreurs lors de l'utilisation de Node.js avec Elasticsearch?
Pour gérer les erreurs, il est important de capturer les exceptions à l'aide de try-catch blocks. Vous pouvez également utiliser des bibliothèques comme 'async' et 'await' pour traiter asynchronement et gérer les erreurs plus efficacement.

Pages liees

Chaque semaine, le meilleur de la tech francaise

Tendances, salaires, outils et opportunites — directement dans votre boite mail.

Gratuit. Desabonnement en un clic. Pas de spam.