Search "Engine"

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Search "Engine"

    Huhu,

    bin gerade dabei, 'ne gescheite Search Engine zu programmieren.

    Möglich sind folgende Formatierungen des Suchbegriffes:
    - Als Wildcard das *
    - AND, OR, NOT um die Suche einzuschränken
    - Text innerhalb zwei " wird als exakte Wortgruppe gesucht

    Desweitern werden dem Script noch per Formular die Datenbank-Felder (MySQL) geliefert (in einem Array), in denen gesucht werden soll.

    Ich habe nun untenstehende Funktion geschrieben / gebastelt (ist wohl der treffendere Ausdruck )

    eigentlich funktioniert sie schon recht gut (für meine Aspekte ), das einzige Problem ist das Behandeln der Suchterme innerhalb der " ".

    Meine Fragen an Euch:
    Wie kann ich das ganze noch optimieren?
    Wie löse ich das Problem mit den " ", welchen Ausdruck muss ich bei preg_match nehmen?
    Stimmt das so mit den Wildcards?

    (dass er standardmässig ein "AND" an den Anfang setzt ist so in Ordnung!)

    Input:
    $arg = Der vom User eingegebener Suchbegriff (immer mit addslashes() maskiert)
    $what = In welchen DB-Felder gesucht werden soll, in 'nem Array
    $exact = eher unwichtig, entscheidet einfach darüber, ob LIKE oder = genutzt werden soll, als Übergabewerte gibts 'exact' und 'part'

    PHP-Code:
    // converts the search string so it can be used in a sql statement
    function convertSearchString($arg$what$exact="part") {

      function 
    getClause($arg$mod$what$exact) {
          
        if(
    $exact == "exact")
        {
          
    $end   "'";
          
    $start = ($mod == "NOT") ? "!='" "='";
        } else {
          
    $end   "%'";
          
    $start = ($mod == "NOT") ? " NOT LIKE '%" " LIKE '%";
        }
        
        
    $mod    = ($mod == "NOT") ? "AND" $mod;
        
    $clause   "";
        while(list(, 
    $val) = each($what))
        {
        
          
    $clause .= " ".$mod." ".$val.$start.$arg.$end;
          
        } 
    /* end while */
          
       
    return $clause;
      
      }
          
      
    // var to return
      
    $out "";
          
      
    // wildcard
      
    $arg str_replace("*""%"$arg);
          
      
    // get out the exact phrases
      
    if (preg_match('/\"[^\"]*\"/'$arg$tmp))
      {
        while (list(, 
    $val) = each($tmp))
        {
          
    $out .= getClause(str_replace('\"'''$val), "AND"$what$exact);
        }
        
    $arg preg_replace("/\"[^\"]*\"/"""$arg);
      } 
    /* end if */
          
      // split up the search string
      
    $params explode(" "$arg);
          
      for (
    $i=0$i<count($params); $i++)
      {
        if (
    $params[$i] == "AND" || $params[$i] == "OR" || $params[$i] == "NOT") {
          
    $out .= getClause($params[$i+1], $params[$i], $what$exact);
        } else {
          if (!
    strpos($out$params[$i]))
          {
            
    $out .= getClause($params[$i], "AND"$what$exact);
          } 
    /* end if */
        
    /* end else */
      
    /* end for */
          
     
    return $out;      


  • #2
    Im Prinzip stellt dir die Datenbank hier das Limit. Suchanfragen per LIKE auf Textfelder sind unheimlich langsam. Dahingengen kann man die Geschwindigkeit des PHP-Scripts ja schon fast vernachlässigen.

    Wenn man mal mehr als nur ein paar Datensätze durchsuchen will, braucht man die MySQL Volltextfunktionen.
    [color="#334D7B"]"Los, lass uns loslegen! Hm ? Quatschen können wir hinterher immer noch!"[/color]
    [color="#9C5245"]"Aber Bommel, wir können jetzt nicht bumsen. Wir müssen doch erst den Kindern - ... "[/color]
    [color="#334D7B"]"Ja ja ja. Du willst immer nur das Eine. Buchstabenzeigen, Buchstabenzeigen - meine Gefühle sind dir wohl scheißegal."[/color]

    © Harald Schmidt

    Kommentar


    • #3
      PHP-Code:
      $out .= getClause(str_replace('\"'''$val), "AND"$what$exact); 
      ämder mal in
      PHP-Code:
      $out .= getClause(str_replace('"'''$val), "AND"$what$exact); 
      mfg

      Kommentar


      • #4
        @Trashar: Ich hatte das anfangs so. Es funktionierte nicht...
        zu berücksichtigen ist wahrscheinlich noch, dass $arg vorher mit addslashes() maskiert wurde.

        @Troublegum: Geschwindigkeit spielt in diesem Fall keine allzu grosse Rolle. Bevor die Resultate ausgegeben werden, kommt noch eine Zwischenseite, so dass der User am Bildschirm gehalten wird

        Mit Optimieren meinte ich eigentlich das korrekte Handhaben der " " im Suchbegriff.

        Beim momentanen regulären Ausdruck bekommt man beim Eingeben des Suchbegriffes
        "such das"
        folgendes von der Funktion zurückgeliefert:
        AND xxx LIKE '%"such das%' AND xxx LIKE '%\%'

        desweitern wäre es eigentlich noch toll, wenn man so etwas eingeben könnte:
        NOT "such das"
        und das dann in folgendes umgewandelt wird:
        AND xxx NOT LIKE '%such das%'

        oder mit oder
        OR "such das"
        => OR xxx LIKE '%such das%'

        nur habe ich momentan nicht die Idee, wie ich das anstellen könnte.
        Da müsste ich doch irgendwas mit preg_split() anstellen, so dass zwar an ' ' (Leerräumen) getrennt wird, aber Text zwischen zwei " nicht getrennt wird.

        -----------------------------------------------------------------


        weiterer Fehler: wenn zwischen Modifier (AND, OR, NOT) und Suchbegriff mehr als ein Leerraum steht....
        -------------------------------------------

        konnte ich lösen.

        hab die for-Schleife damit ersetzt:

        PHP-Code:
              for ($i=0$i<count($params); $i++)
              {
                if (
        $params[$i] == "AND" || $params[$i] == "OR" || $params[$i] == "NOT") {
                  
        $count 0;
                  while (
        $count >= 0)
                  {
                    
        $count++;
                    if (!empty(
        $params[$i+$count]))
                    {
                      
        $out .= getClause($params[$i+$count], $params[$i], $what$exact);
                      break;
                    } 
        /* end if */
                  
        }/* end while */
                
        } else if (!empty($params[$i])) {
                  if (!
        strpos($out$params[$i]))
                  {
                    
        $out .= getClause($params[$i], "AND"$what$exact);
                  } 
        /* end if */
                
        } else {
                  continue;
                } 
        /* end else */
              
        /* end for */ 
        Zuletzt geändert von roobin; 11.10.2003, 11:36.

        Kommentar


        • #5
          schau mal hier:
          http://www.php-resource.de/forum/sho...nk+komfortabel
          [color="#334D7B"]"Los, lass uns loslegen! Hm ? Quatschen können wir hinterher immer noch!"[/color]
          [color="#9C5245"]"Aber Bommel, wir können jetzt nicht bumsen. Wir müssen doch erst den Kindern - ... "[/color]
          [color="#334D7B"]"Ja ja ja. Du willst immer nur das Eine. Buchstabenzeigen, Buchstabenzeigen - meine Gefühle sind dir wohl scheißegal."[/color]

          © Harald Schmidt

          Kommentar

          Lädt...
          X