Module Search : intégration d'une source de données externe

Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
#1
Ayant cherché un peu partout comment indexer et rechercher des données via le module Search en dehors du contenu du CMS, je pense que ce post pourra intéresser.

Donc pour résumer, j'ai une table Mysql qui contient un catalogue produit réalisé hors CMSMS que je souhaite indexer et dont je veux voir afficher les résultats lors d'une recherche.

Exemple, ma table s'appelle "produits", possède entre autre une colonne "plante" et un enregistrement de cette table a comme valeur de plante "cacao du Brésil". Je souhaite que lorsque l'internaute saisisse "cacao", il obtienne non seulement des résultats pointant vers les articles du CMS mais obtienne aussi un lien vers la fiche produit qui contient le mot "cacao".

Pour arriver à mes fins, j'ai ajouté 2 portions de codes dans 2 fichiers différents du dossier /modules/Search (cmsms1.6.7)


1/ Partie Indexation, fichier search.tools.php - à la dernière ligne de la fonction search_Reindex(&$module)

Code :
$sql_produit = "SELECT * FROM produits";
$produit = mysql_query($sql_produit);
while ($la_ligne_produit = mysql_fetch_array($produit)) {
    $texte_pour_indexation = $la_ligne_produit["nom"].$la_ligne_produit["nom_latin"].$la_ligne_produit["plante"].$la_ligne_produit["indication"].$la_ligne_produit["descriptif"].$la_ligne_produit["histoire"];
    $module->AddWords('Search', $la_ligne_produit['id_produit'], 'cataproduit', $texte_pour_indexation, NULL);
}

en gros, on parcourt la table et on ajoute ligne par ligne, un identifiant du produit, tout le texte à indexer ainsi qu'un marqueur constant (cataproduit)

2/ Partie recherche, fichier action.dosearch.php - dans la boucle d'ajout de résultats à la collection while ($result && !$result->EOF) on ajoute un bloc elseif :

Code :
else if ($result->fields['extra_attr'] == 'cataproduit') {            
    $id_produit = $result->fields['content_id'];
    $sql_recherche_produit = "SELECT * FROM arko_produits WHERE id_produit=".$id_produit;
    $recherche_produit = mysql_query($sql_recherche_produit);
    $la_ligne_recherche_produit = mysql_fetch_array($recherche_produit);
    $lurl = '/index.php?page=produit&id_produit='.$id_produit;
    $col->AddItem($la_ligne_recherche_produit['nom'], $lurl, 'product file', $result->fields['total_weight']);
}

les blocs elseif servant à ajouter des cas en fonction de la provenance, on greffe le notre qui ajoutera à la collection les résultats du catalogue produit externe au CMS. A noter que AddItem() permet de stocker à la fois la variable à utiliser mais aussi l'url d'accès à la ressource. Cette url est bien entendue personnalisée puisqu'elle est censée affichée une fiche produit en dehors de CMSMS.

Si vous avez une problématique connexe, sachez que je me suis inspiré du travail de snyderp http://forum.cmsmadesimple.org/viewtopic.php?t=33025 qui présente une méthode similaire mais appliquée à un module maison.
Répondre
#1
Ayant cherché un peu partout comment indexer et rechercher des données via le module Search en dehors du contenu du CMS, je pense que ce post pourra intéresser.

Donc pour résumer, j'ai une table Mysql qui contient un catalogue produit réalisé hors CMSMS que je souhaite indexer et dont je veux voir afficher les résultats lors d'une recherche.

Exemple, ma table s'appelle "produits", possède entre autre une colonne "plante" et un enregistrement de cette table a comme valeur de plante "cacao du Brésil". Je souhaite que lorsque l'internaute saisisse "cacao", il obtienne non seulement des résultats pointant vers les articles du CMS mais obtienne aussi un lien vers la fiche produit qui contient le mot "cacao".

Pour arriver à mes fins, j'ai ajouté 2 portions de codes dans 2 fichiers différents du dossier /modules/Search (cmsms1.6.7)


1/ Partie Indexation, fichier search.tools.php - à la dernière ligne de la fonction search_Reindex(&$module)

Code :
$sql_produit = "SELECT * FROM produits";
$produit = mysql_query($sql_produit);
while ($la_ligne_produit = mysql_fetch_array($produit)) {
    $texte_pour_indexation = $la_ligne_produit["nom"].$la_ligne_produit["nom_latin"].$la_ligne_produit["plante"].$la_ligne_produit["indication"].$la_ligne_produit["descriptif"].$la_ligne_produit["histoire"];
    $module->AddWords('Search', $la_ligne_produit['id_produit'], 'cataproduit', $texte_pour_indexation, NULL);
}

en gros, on parcourt la table et on ajoute ligne par ligne, un identifiant du produit, tout le texte à indexer ainsi qu'un marqueur constant (cataproduit)

2/ Partie recherche, fichier action.dosearch.php - dans la boucle d'ajout de résultats à la collection while ($result && !$result->EOF) on ajoute un bloc elseif :

Code :
else if ($result->fields['extra_attr'] == 'cataproduit') {            
    $id_produit = $result->fields['content_id'];
    $sql_recherche_produit = "SELECT * FROM arko_produits WHERE id_produit=".$id_produit;
    $recherche_produit = mysql_query($sql_recherche_produit);
    $la_ligne_recherche_produit = mysql_fetch_array($recherche_produit);
    $lurl = '/index.php?page=produit&id_produit='.$id_produit;
    $col->AddItem($la_ligne_recherche_produit['nom'], $lurl, 'product file', $result->fields['total_weight']);
}

les blocs elseif servant à ajouter des cas en fonction de la provenance, on greffe le notre qui ajoutera à la collection les résultats du catalogue produit externe au CMS. A noter que AddItem() permet de stocker à la fois la variable à utiliser mais aussi l'url d'accès à la ressource. Cette url est bien entendue personnalisée puisqu'elle est censée affichée une fiche produit en dehors de CMSMS.

Si vous avez une problématique connexe, sachez que je me suis inspiré du travail de snyderp http://forum.cmsmadesimple.org/viewtopic.php?t=33025 qui présente une méthode similaire mais appliquée à un module maison.
Répondre
#2
je ne suis pas certain de mémoire de ce que peut proposer Search en terme d'évènement mais serait il possible de voir si une UDT s'appuyant sur un évenement de Search pourrait pas répondre au besoin sans devoir taper dans le code de Search ?

Citation :Recherche SearchInitiated Envoyé quand une recherche est débutée


par exemple tu gère une sorte de cache de ta base de donnée externe (un hash serait parfait)

si kkun fait une recherche, l'évènement SearchInitiated active ton UDT

ton UDT regarde le hash de ta table externe. Si identique au dernier hash enregistré, il rend la main à search. Si aucun hash enregistré ou si hash différent alors il génère un index sur ta table pour search puis rend la main
Répondre
#2
je ne suis pas certain de mémoire de ce que peut proposer Search en terme d'évènement mais serait il possible de voir si une UDT s'appuyant sur un évenement de Search pourrait pas répondre au besoin sans devoir taper dans le code de Search ?

Citation :Recherche SearchInitiated Envoyé quand une recherche est débutée


par exemple tu gère une sorte de cache de ta base de donnée externe (un hash serait parfait)

si kkun fait une recherche, l'évènement SearchInitiated active ton UDT

ton UDT regarde le hash de ta table externe. Si identique au dernier hash enregistré, il rend la main à search. Si aucun hash enregistré ou si hash différent alors il génère un index sur ta table pour search puis rend la main
Répondre
#3
Merci pour ce commentaire,

Ajouter des patch de code dans le module Search n'est certes pas très élégant...

Cependant, l'avantage de cette méthode est qu'elle utilise les objets (au sens développement) du module que ce soit pour l'indexation comme pour la recherche.

Ainsi, on peut bénéficier de toute la puissance du module Search avec des données étrangères au CMS...
Répondre
#3
Merci pour ce commentaire,

Ajouter des patch de code dans le module Search n'est certes pas très élégant...

Cependant, l'avantage de cette méthode est qu'elle utilise les objets (au sens développement) du module que ce soit pour l'indexation comme pour la recherche.

Ainsi, on peut bénéficier de toute la puissance du module Search avec des données étrangères au CMS...
Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)