slam:indexation_de_donnees_non_structurees

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 :

  • D'interroger plus rapidement les document déjà indexées
  • De rechercher avec plus de flexibilité (filtres, tolérance aux fautes, suggestions, etc.).
  • De tester des requêtes différentes (exemple : “boulangeries artisanales” après avoir indexé toutes les boulangeries).

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”}:-)

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

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

Quelques sources intéressantes :

Livres et œuvres littéraires

  • Open Library API → Données de livres (titres, auteurs, sujets).
  • Projet Gutenberg → Textes de livres libres de droits.

Données gouvernementales

  • data.gouv.fr → Documents publics, articles, descriptions.
  • data.gov → Données ouvertes américaines.

Articles Wikipédia

  • Wikidata → Informations structurées de Wikipédia.
  • Wikipedia Dumps → Extractions de pages.

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.

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;

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.

  • Ajouter plus de données (augmenter limit=100).
  • Tester avec d’autres sources (Wikipedia, data.gouv).
  • Indexer des descriptions et extraits pour la recherche plein texte.
  • slam/indexation_de_donnees_non_structurees.txt
  • Dernière modification : 2025/02/20 09:41
  • de dthevenot