Hi,
ich bastel gerade an einem Script für eine Suchmaschine, das zwar an und für sich gut funktioniert, jedoch recht langsam ist. Gibts vielleicht eine Möglichkeit, da was zu optimieren?
Was das Script macht: gibt der Besucher als Suchbegriff mehrere Wörter ein zu denen nichts gefunden wird, soll mit der Levenshteinfunktion eine Alternative vorgeschlagen werden. Im Moment gehe ich davon aus, dass die eingegebenen Wörter direkt hintereinander stehen (also quasi eine Suche in Anführungszeichen "wort1 wort2"). Damit nur direkt hintereinander stehende Wörter gefunden werden können, lese ich die Datei, die bei der Suche durchsucht wird ein, und erzeuge immer 2-er Gruppen der darin enthaltenen Wörter (bzw. entsprechend längere Gruppen, wenn mehr Wörter eingegeben wurde).
Bspw. steht in der Datei: "Heute ist ein schöner Tag." Daraus mache ich: "Heute ist", "ist ein", "ein schöner", "schöner Tag".
Diese Gruppen lassen sich ja nun sehr einfach mit dem eingegebenen Suchbegriff vergleichen. Doch diese Gruppenerzeugung ist wohl die Bremse, pro zusätzlichem eingebenen Wort steigt die Ladezeit der Seite um ca. 0.65 sec. (eine Suche mit einem einzigen Begriff ohne diese Gruppen dauert ca. 0.2 sec.).
Ich dachte schon zu Beginn, dass das vermutlich sehr rechenintensiv würde, aber eine Alternative fällt mir eigentlich nicht ein. Hat vielleicht jemand eine Idee, was man da ändern könnte (Google kriegts doch auch hin ;))?
Hier das Script (nicht lachen ;-)):
<?php
$searchexp = $_GET['searchexp'];
$anz_searchexp = count($searchexp);
$words = array();
$gruppe_liste = array();
$datei = "data.txt";
$zeilen = file($datei);
$anz_zeilen = sizeof($zeilen);
if($anz_searchexp >1)
{
for($i=0; $i<$anz_zeilen; $i++)
{
list (, , , , $inhalt) = split("\\|", chop($zeilen[$i]));
$inhalt = trim($inhalt);
$liste = preg_split('/[\s,.]+/i', $inhalt);
$anz_liste = count($liste);
for($j=0; $j < ($anz_liste - ($anz_searchexp - 1)); $j++)
{
$k = 1;
$arr_grppe = array();
foreach($liste as $word)
{
if($k <= $anz_searchexp)
{
array_push($arr_gruppe,$word);
$k++;
}
}
$gruppe_searchexp = implode(".-.",$arr_gruppe);
array_push($gruppe_liste,$gruppe_searchexp)
unset($liste[$j]);
}
}
...
..
.
?>
Vielleicht sagt ja jemand "Das geht doch viiiiieeeeel einfacher" :)
Danke schon mal an alle, die sich die Mühe machen das alles zu lesen.