2009-07-28 3 views
4

J'ai un moteur de recherche léger et décent qui fonctionne pour l'un de mes sites en utilisant MySQL fulltext index et php pour analyser les résultats. Bien fonctionner, mais je voudrais offrir plus de résultats semblables à google avec des extraits de texte à partir des résultats et les mots trouvés mis en évidence. Vous cherchez une solution basée sur PHP. Des recommandations?Meilleures pratiques pour afficher les résultats de recherche avec des extraits de texte associés à partir du résultat réel

Répondre

5

La recherche dans la base de données actuelle est possible jusqu'à ce que vous vouliez ajouter des fonctionnalités intéressantes comme celle ci-dessus. Dans mon expérience, il est préférable de créer une table de recherche dédiée, avec des mots-clés et des identifiants de pages/URL/etc. Puis remplissez ce tableau tous les n heures avec le contenu. Au cours de cette population, vous pouvez ajouter des extraits pour chaque document pour chaque mot clé.

Alternativement, un hack pourrait être:

<?php 
$text = 'This is an example text page with content. It could be red, green or blue.'; 
$keyword = 'red'; 
$size = 5; // size of snippet either side of keyword 

$snippet = '...'.substr($text, strpos($text, $keyword) - $size, strpos($text, $keyword) + sizeof($keyword) + $size).'...'; 
$snippet = str_replace($keyword, '<strong>'.$keyword.'</strong>', $snippet); 
echo $snippet; 
?> 
+0

J'aime cette solution. J'ai un trafic assez léger donc le traitement supplémentaire sur chaque requête de recherche est bien. Merci!! – phirschybar

+0

Vous pouvez changer les strpos en stripos, et changer le str_replace en preg_replace afin de conserver la casse. Par exemple, si vous recherchez "Burgers", vous ne souhaitez pas que le texte en gras soit remplacé par "hamburger". Preg_replace ('/('.$ keyword.')/I ',' $ 1 ', $ snippet) – Sherri

1

utilisez preg_replace() (ou une fonction similaire) et remplacez votre chaîne de recherche par du texte en surbrillance. par exemple.

$highlighted_text = preg_replace("/$search/", "<span class='highlighted'>$search</span>", $full_text); 
+1

Mise en évidence est pas mon problème. Je m'interroge sur la meilleure façon d'obtenir l'extrait _around_ le terme de recherche. – phirschybar

3

Pour MySQL, votre meilleur pari serait d'abord diviser vos mots de requête, nettoyer vos valeurs, puis concaténer tout nouveau dans une belle expression régulière.

Afin de mettre en évidence vos résultats, vous pouvez utiliser la balise <strong>. Son utilisation serait sémantique comme vous mettez fort accent sur un élément.

// Done ONCE per page load: 
    $search = "Hello World"; 

    //Remove the quotes and stop words 
    $search = str_ireplace(array('"', 'and', 'or'), array('', '', ''), $search); 

    // Get the words array 
    $words = explode(' ', $search); 

    // Clean the array, remove duplicates, etc. 
    function remove_empty_values($value) { return trim($value) != ''; } 
    function regex_escape(&$value) { $value = preg_quote($value, '/'); } 
    $words = array_filter($words, 'remove_empty_values'); 
    $words = array_unique($words); 
    array_walk($words, 'regex_escape'); 

    $regex = '/(' . implode('|', $words) . ')/gi'; 

// Done FOR EACH result 
    $result = "Something something hello there yes world fun nice"; 
    $highlighted = preg_replace($regex, '<strong>$0</strong>', $result); 

Si vous utilisez PostgreSQL, vous pouvez simplement utiliser le haut-ts_headlineas described in the documentation.

-1

Sur un site plus grand, je pense que l'utilisation de javascript, jquery quelque chose comme serait la voie à suivre

Questions connexes