slam:indexation_de_donnees_non_structurees

Ceci est une ancienne révision du document !


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

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

Utilise curl ou Postman :

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"}]'

Avec Postman

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 !

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 une entreprise contenant “boulangerie” dans son nom :

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.).

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.1739436016.txt.gz
  • Dernière modification : 2025/02/13 09:40
  • de dthevenot