Table des matières

Data Science: Les bases de données NoSQL, l'analyse de texte et l'extraction d'informations de données non structurées font partie intégrante de la data science.

Gestion des données non structurées : Des articles et livres blancs sur la gestion des données non structurées et leur indexation (comme ceux d'Elasticsearch et MongoDB) sont des ressources pour l'architecture de systèmes de gestion de données non structurées.

Indexation de données non structurées

Elasticsearch : Un moteur de recherche et d'indexation de texte largement utilisé pour indexer des données non structurées, comme des logs ou des contenus textuels.

Plus léger : Meilisearch

L’indexation d’un document est un procédé consistant à le marquer ou à l’associer avec certains types d’information. L’opération facilite ensuite la recherche et la récupération des informations grâce à un moteur de recherche.

La recherche sur MeiliSearch permet :

Installation de Meilisearch

docker run -p 7700:7700 getmeili/meilisearch

Cela lance MeiliSearch en arrière-plan sur le port 7700.

Tester : curl http://localhost:7700/health → {“status”:“available”}:-)

Utilisation : Exemple simple

Envoi des données

Avec curl

Indexer des documents (titres de livres) : On va créer un index nommé books et y ajouter des documents.

curl -X POST 'http://localhost:7700/indexes/books/documents' -H 'Content-Type:application/json' --data-binary '[{"id":1,"title":"petit prince"},{"id":2,"title":"Le soulier de satin"},{"id":3,"title":"Les Misérables"},{"id":4,"title":"1984"}]'

Puis rechercher un document On va chercher tous les livres contenant “Prince” :

curl -X GET 'http://localhost:7700/indexes/books/search' 
-H 'Content-Type: application/json' 
--data-binary '{
    "q": "Prince"
}'

MeiliSearch retourne les documents correspondants avec une recherche full-text rapide !

Avec Postman (conseillée)

Indexer des documents (titres de livres) : On va créer un index nommé movies et y ajouter des documents.

  1. installer Postman
  2. Vérifier que Meilisearch fonctionne : Méthode : GET(recherche) URL : http://localhost:7700/health
    • Attendu : { “status”: “available” }
  3. Créer un index (si non existant) : Méthode : POST(création) URL : http://localhost:7700/indexes
    • Headers (Key:Value):
      • Content-Type: application/json
      • Body (raw→JSON) :
        {
          "uid": "movies",
          "primaryKey": "id"
        }
  4. Indexer des documents : Méthode : POST URL : http://localhost:7700/indexes/movies/documents Headers : Content-Type: application/json
    • Body (raw→JSON) :
        
      [
        {
          "id": 1,
          "title": "Inception",
          "genre": "Sci-Fi"
        },
        {
          "id": 2,
          "title": "The Dark Knight",
          "genre": "Action"
        }
      ]
  5. Rechercher des documents contenant “inception” : Méthode : GET URL : http://localhost:7700/indexes/movies/search?q=inception

Utilisation d'un jeu de données Open Data

On va utiliser un jeu de données public contenant du texte.

Quelques sources intéressantes :

Livres et œuvres littéraires

Données gouvernementales

Articles Wikipédia

Récupérer les données

On va utiliser l'API Recherche d’entreprises de data.gouv.fr : https://www.data.gouv.fr/fr/dataservices/api-recherche-dentreprises/

L’API est accessible via : 🔗 https://recherche-entreprises.api.gouv.fr/

Exemple de requête pour chercher les documents contenant “boulangerie” :

curl -X GET “https://recherche-entreprises.api.gouv.fr/search?q=boulangerie&per_page=5 Cela retourne une liste d'entreprises avec leurs infos (nom, SIRET, activité, adresse, etc.).

Le faire avec Postman.

Indexer des données dans MeiliSearch

On va récupérer ces données et les envoyer dans MeiliSearch en format JSON.

Important: pb entre serveur php vagrant en localhost:2080 ou ip 10.0.2.15 et docker milisearch en localhost:7700 ou ip 172.17.0.2, vérifier le parefeu, les ports…

<?php

// 1/Fonction pour récupérer les entreprises depuis l'API Recherche d'entreprises
function rechercherEntreprises($query, $limit) {
    $url = "https://recherche-entreprises.api.gouv.fr/search?q=" . urlencode($query) . "&per_page=" . $limit;
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    
    $response = curl_exec($ch);
    curl_close($ch);
    
    return json_decode($response, true)['results'] ?? [];
}

// 2/Fonction pour envoyer les données à MeiliSearch
function indexerDansMeiliSearch($data) {
    $meiliUrl = "http://localhost:7700/indexes/entreprises/documents";
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $meiliUrl);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
    
    $response = curl_exec($ch);
    curl_close($ch);
    
    return $response;
}

// 3/Exécution : récupérer et indexer les entreprises
$query = "boulangerie"; // Modifier la recherche ici
$entreprises = rechercherEntreprises($query, 10);

$formattedData = array_map(function ($entreprise) {
    return [
        "id" => $entreprise['siren'],
        "nom" => $entreprise['nom_entreprise'] ?? "Inconnu",
        "siret" => $entreprise['siret'] ?? "Inconnu",
        "activite" => $entreprise['libelle_activite'] ?? "Non renseignée",
        "adresse" => $entreprise['adresse'] ?? "Inconnue"
    ];
}, $entreprises);

// 4/Envoyer à MeiliSearch
$result = indexerDansMeiliSearch($formattedData);
echo "Résultat de l'indexation : " . $result;

Rechercher une entreprise indexée

Après indexation, on peut tester une recherche dans MeiliSearch :

curl -X POST 'http://localhost:7700/indexes/entreprises/search' \
     -H 'Content-Type: application/json' \
     --data-binary '{
         "q": "boulangerie artisanale"
     }'

Cela retournera les entreprises ou le mot “boulangerie artisanal” apparaît.

A tester