Boardunity & Video Forum

Boardunity & Video Forum (https://boardunity.de/)
-   Programmierung und Datenbanken (https://boardunity.de/programmierung-datenbanken-f23.html)
-   -   Suchergebnisse "googlifizieren" (https://boardunity.de/suchergebnisse-googlifizieren-t2362.html)

exe 10.09.2004 12:33

Suchergebnisse "googlifizieren"
 
Gesucht und nicht gefunden: Ansätze wie man Suchergebnisse so darstellt wie das in Suchmaschinen so üblich ist. Also in der Ergebnisliste eine Einleitung der gefundenen Seite darstellen und hierbei jeweils ein bisschen Text vor und nach dem Treffer aus dem Text anzeigen.

Da es hierzu in PHP nicht viel zu finden gab (das einzige war dieses Tutorial welches aber eher einem Witz ähnelt) habe ich eine Funktion geschrieben die auch von anderen nutzbar ist. Möglicherweise besteht daran ja Interesse. Der Code erhebt keinen Anspruch auf Perfektion oder Fehlerlosigkeit, Benutzung auf eigene Veranwortung. Die Lizenz ist auch einfach: benutz ihn wie du willst für was du willst.

PHP-Code:

<?PHP
/**
 * Makes a search teaser like the ones displayed in google
 * search results.
 *
 * @author Johannes Klose <[email protected]>
 * @param  string $text          Text which should be "googlified"
 * @param  mixed  $query         The search query, either as array of search words or query string
 * @param  string $highlight     Highlight template with a %s spacer for the search word
 * @param  int    $teaserLength  Maximum length of the teaser (defaults to 300)
 * @param  int    $minGap        Minimum of characters as space between two extracts
 * @param  int    $minWordLength Minimum length of a search word (defaults to 3)
 * @return mixed                 Googlified text as string or boolean false on failure
 **/
function googlifyMe($text$query$highlight$teaserLength 400$minGap 5$minWordLength 3)
{
        if(!
is_array($query)) {
                
$query    preg_replace('/[^\w\s]/',                            ' '$query);
                
$query    preg_replace('/\b\w{0,'.($minWordLength 1).'}\b/'' '$query);
                
$query    preg_replace('/\s/',                                 ' '$query);
                
$query    preg_replace('/\s{2,}/',                             ' '$query);
                
$words    array_unique(explode(' 'trim($query)));
                
$numWords count($words);
        } else {
                
$words    $query;
                
$numWords count($words);
        }

        if(
$numWords <= 0) {
                return 
false;
        }

        
$pre      round(((($teaserLength $numWords) / 2) - $minGap), 0);
        
$pre      $pre $pre;
        
$searchHi '/('.join('|'$words).')/ie';
        
$search   join('|'$words);
        
$search   '/\b(.{0,'.$pre.'})('.$search.')(.{0,'.$pre.'})\b.{'.$minGap.'}/si';
        
$result   '';

        
preg_match_all($search$text$matches);
        
$wordsDone    = array();
        
$countMatches count($matches[0]);

        for(
$i 0$i $countMatches$i++)
        {
                
$preWord  $matches[1][$i];
                
$postWord $matches[3][$i];
                
$word     $matches[2][$i];

                if(isset(
$wordsDone[strtolower($word)])) {
                        continue;
                } else {
                        
$wordsDone[strtolower($word)] = 1;
                }

                
$tmp      ' ... '.$preWord.$word.$postWord;
                
$result  .= preg_replace($searchHi'sprintf($highlight, stripslashes("\1"))'$tmp);
        }

        return 
trim($result).' ...';
}
?>

Diese Funktion nimmt einen Text, Suchwörter und ein Highlightemplate und liefert eine Zusammenfassung im Suchmaschinenstil zurück.

Die Parameter im einzelnen:

$text - der Text der Zusammengefasst werden soll (logisch)
$query - entweder ein Suchstring oder ein Array mit Suchwörtern. Wenn es ein String ist wird er automatisch geparsed und in ein Array mit Suchwörtern aufgespalten.
$highlight - eine Vorlage zum hervorheben der Suchwörter. Die Vorlage wird via sprintf() bearbeitet. Das bedeutet das %s durch das hervorzuhebende Suchwort ersetzt wird.
$teaserLength - Richtwert für die maximale Länge der Zusammenfassung. Kann gerinfügig unter- und überschritten werden.
$minGap - minimum an Zeichen die zwischen zwei extrahierten Textstellen im Text sein müssen
$minWordLength - die minimale Suchwortlänge, spielt nur eine Rolle wenn $query ein String ist

Beispiel:
Code:

$text = 'eigentlich ist die postgresql ja ganz nett, aber mysql ist ja auch nicht zu verachten. php macht aber vorallem in verbindung mit einem apache webserver spass. man kann das zwar auch im cgi modus betreiben, aber das macht meist eher weniger spass. wie auch immer ist dies ein ganz dämlicher blindtext und ihm sollte nicht mehr beachtung geschenkt werden als unbedingt notwändig. und hier ist jetzt auch schon wieder schluss.';
$query = 'php mysql apache blindtext';
$highlight = '<b>%s</b>';

echo googlifyMe($text, $query, $highlight);

Ausgabe:
Zitat:

... eigentlich ist die postgresql ja ganz nett, aber mysql ist ja auch nicht zu verachten. php macht aber ... in verbindung mit einem apache webserver spass. man kann das zwar auch im cgi ... . wie auch immer ist dies ein ganz dämlicher blindtext und ihm sollte nicht mehr beachtung geschenkt ...
Verbesserungsvorschläge, Bugreports und sonstiges Feedback sind natürlich herzlich Willkommen :)

itst 10.09.2004 12:56

Interessant vielleicht auch der Code des TextSearchImproved-Mod von Wikka: http://wikka.jsnx.com/Mod014fTextSearchImproved

MaMo 10.09.2004 16:25

Hey danke Exe, genau sowas hab ich für mein Board gesucht *einbau*

MfG MaMo

codethief 10.09.2004 18:06

Hey danke exe. :)
Das bau ich auch in mein Forum ein.
Off-Topic:
Benutzt du eigentlich auch das Zend Studio? Die Kommentare sehen so danach aus. ;)

exe 10.09.2004 18:49

Ich hab eben noch zwei kleine Bugs behoben die unter Umständen die Zusammenfassung stark in die Länge ziehen oder stark verkürzen. Wenn ihr die Funktion schon eingebaut habt solltet ihr sie nochmal mit der Version im Eingangsbeitrag ersetzen.

Zitat:

Zitat von codethief
Off-Topic:
Benutzt du eigentlich auch das Zend Studio? Die Kommentare sehen so danach aus. ;)

Off-Topic:
Nicht mehr. Ich habe es früher benutzt, aber auf Dauer war die Java-Oberfläche nicht so praktisch auf meiner uralten 450Mhz Gurke ;) Ich benutze im moment KDevelop, was eigentlich auch ganz brauchbar ist. Die Kommentare sind übrigens nicht "Zend Studio" sondern phpdoc, nachzulesen unter http://www.phpdoc.org

Patrick Gotthardt 10.09.2004 19:29

Ich bedanke mich auch mal. Hab zwar aktuell keine Verwendung dafür, aber wie ich mich kenne werd ich das bestimmt gebrauchen können. ;)

Philipp Gérard 10.09.2004 21:36

hübsch, aber das zieht doch ziemlich an der Performance bei einigen Suchergebnissen...

codethief 11.09.2004 10:00

@exe: Das war mir noch nicht bekannt. Danke dir! :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:39 Uhr.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25