Philipp.: Script sehr langsam - wie optimieren?

Beitrag lesen

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'];                            #Variable mit Suchbegriffen  
$anz_searchexp = count($searchexp);                         #Anzahl der Suchbegriffe ermitteln  
$words = array();                                           #Array in dem am Ende die relevanten Alternativen stehen  
$gruppe_liste = array();                                    #Array in dem alle Gruppen gespeichert werden  
  
$datei = "data.txt";                                        #Datei die durchsucht wird, öffnen und einlesen  
$zeilen = file($datei);  
$anz_zeilen = sizeof($zeilen);                              #Zeilenanzahl ermitteln  
  
if($anz_searchexp >1)                                       #Prüfen ob der Suchbegriff aus mehreren Wörtern besteht  
{  
  for($i=0; $i<$anz_zeilen; $i++)                           #Schleife durchlaufen bis letzte Zeile erreicht  
  {  
  list (, , , , $inhalt) = split("\\|", chop($zeilen[$i])); #Split um unnötigen Text nicht einzulesen  
  
  $inhalt = trim($inhalt);  
  
  $liste = preg_split('/[\s,.]+/i', $inhalt);               #Array mit Wörtern erzeugen, split bei Leerzeichen , .  
  $anz_liste = count($liste);                               #Anzahl der Wörter ermitteln  
  
  for($j=0; $j < ($anz_liste - ($anz_searchexp - 1)); $j++) #Schleife durchlaufen, bis die letzte mögliche Gruppe erzeugt ist  
  {  
    $k = 1;  
    $arr_grppe = array();                                   #Array in dem die Wörter pro Gruppe gespeichert werden / Zurücksetzen von der letzten Gruppe  
    foreach($liste as $word)                                #Schleife durchlaufen bis die Gruppe so viele Wörter enthält wie der Suchbegriff  
    {  
      if($k <= $anz_searchexp)  
      {  
        array_push($arr_gruppe,$word);  
        $k++;  
      }  
    }  
    $gruppe_searchexp = implode(".-.",$arr_gruppe);         #Suchbegriffe zu String zusammenfügen, .-. als Platzhalter um die Wörter später trennen zu können  
    array_push($gruppe_liste,$gruppe_searchexp)             #Array in dem alle Gruppen gespeichert werden  
    unset($liste[$j]);                                      #Erstes Wort aus dem Array löschen, nächste Gruppe beginnt bei Wort $liste[$j+1]  
  }  
}  
  
...  
..  
.  
?>

Vielleicht sagt ja jemand "Das geht doch viiiiieeeeel einfacher" :)
Danke schon mal an alle, die sich die Mühe machen das alles zu lesen.