Suchalgorithmus für MySQL Tabelle

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

  • Suchalgorithmus für MySQL Tabelle

    Hallo zusammen

    Ich habe eine Tabelle die etwa so ausschaut:

    SID, PID sind eineindeutig, Vor- und Nachname natürlich nicht, geschlecht ist 1=männlich, 2=weiblich

    Das Skript bekommt einen String (und Key) und gibt eine JSON Antwort zurück welche PID, Vor- und Nachname enthält.

    Der String kann allerdings etwas komplexer sein, zB so:
    "Fab,Math,Andre" oder "männlich", "Ma Must, Han Müll", "Mustermann" oder "123" (suche via PID).

    Das Script funktioniert bis jetzt teilweise, und zwar wird einfach das "oder" genommen, aber nicht das "und", also "Fab oder Math oder Andre" geht, aber nicht "Ma und Must".

    Code:
    $filter = mysql_real_escape_string($_GET['filter']);
    //$filter = "fab pi, seb bo, tun";
    //$filter = "pigagn,bock,tunay";
    $abfragesegment = "(vor LIKE '%XXX%' OR nach LIKE '%XXX%' OR pid LIKE '%XXX%')";
    
    
    
    $t1 = explode(",",$filter);
    while(list($key,$value)=each($t1)){
    	$value = trim($value);
    	if($value=="männer"){
    		$t2[] = "(geschlecht=1)";
    	}elseif($value=="frauen"){
    		$t2[] = "(geschlecht=2)";
    	}elseif(strlen($value)>=3){
    		$t2[] = str_replace("XXX",$value,$abfragesegment);
    	}
    }
    //print_r($t2);
    
    
    
    $wherequery = "(".implode(" OR ",$t2).")";
    
    $query = "SELECT sid,pid,vor,nach,geschlecht FROM students WHERE pid!=0 AND 
    (
    	".$wherequery."
    )
    LIMIT 0,300";
    $res = mysql_query($query)OR DIE(mysql_error());
    while($row=mysql_fetch_array($res)){
    	$resultate[]=array($row['pid'],$row['sid'], $row['vor']." ".$row['nach']);
    }
    echo json_encode($resultate);
    Wenn ich das jetzt noch erweitern würde gäbe das schnell einen recht langen Query.

    Gibt es ein Framework oder so was, womit ich einfacher solche Suchquerys machen kann?

  • #2
    Hallo Fabio,

    ich versteh deine Suchstring Syntax nicht so wirklich, sind Kommas der UND Trenner und "oder" der ODER Trenner ? Welche Bedeutung haben die Anführungszeichen ? Ist der Suchstring immer (wenn ich ihn so richtig deute) in DNF ( Disjunktive Normalform ? Wikipedia )?

    Wie auch immer, hast du dir schon einmal die boolsche Volltextsuche von MySQL angesehen?
    ( MySQL :: MySQL 5.0 Reference Manual :: 11.9.2 Boolean Full-Text Searches , sofern MyISAM als Table Engine)

    Wahrscheinlich es sinnvoller ist deinen Suchstring zu einem gültigen Volltextausdruck umzuformen, als dein Query derart aufzubauen.

    Wenn die Suche komplexer wird und bietet sich u.U. auch Blick auf Apache Lucene ( Welcome to Apache Lucene! ) an, für das es auch z.B. eine Zend Framework Komponente gibt.

    Gruß Danny
    hostbar - Full Service Internet Agentur

    Kommentar

    Lädt...
    X