tabellenabfragen für suchfunktion

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

  • tabellenabfragen für suchfunktion

    aaalso: ich bin grad am grübeln, wie ich am besten eine suchfunktion für meine site realisiere...
    was bis jetzt da ist, sind nur n paar denkansätze, aber vielleicht fällt euch ja ein, wie man das ganze verbessern könnte.
    also erstmal hab ich mir gedacht, der user kommt auf ne seite, wo er sein suchwort eingeben kann
    + bei 4 checkboxen auswählen, wo er überall nach dem wort suchen möchte. Die Checkboxen sind folgende:
    Interpreten (CDs / Artikel / News)
    CDs (Album-Titel und Interpreten der Alben)
    News
    Autoren

    alles klar soweit. die checkboxen werden, je nach anklicken mit dem
    wert übergeben und dann wird gecheckt, wo überall gesucht
    werden soll: quasi so:
    PHP-Code:
    //Definition, welche bereiche durchsucht werden sollen
    if(!isset($cd) | !isset($news) | !isset($interpreten) | $schalter "ein"){
    /* Wenn der schalter ein ist, aber keine andern variablen zum
     durchsuchen übergeben wurden */
    $cd 1;//Alles auf 1 setzen, damit alles durchsucht wird
    $news 1;
    $interpreten 1;
    }
    // DER TEIL WO DIE CDS ABGEFRAGT WERDEN
    if($cd 1){// Wenn die Cds zum durchsuchen gewählt wurden, dann abfrage. 
    so und jetz wirds lustig:der query, der mir jetzt spontan einfällt ist folgender:
    PHP-Code:
    SELECT FROM muak_cds WHERE text LIKE '%$suchwort%' OR interpret LIKE '%$suchwort%'
     
    OR trackliste LIKE '%$suchwort%' OR autor LIKE '%$suchwort%' 
    jetz kommt mir das ein wenig unperformant vor--> hat dazu jemand nen verbesserungsvorschlag?

    und hier die übergabe an meinen smarty

    PHP-Code:
    $anzahlcds mysql_num_rows($resultcd);
    while (
    $r=mysql_fetch_array($res)) {
                
    $tmp = array(
                    
    'username' => $r['username'],
                    
    'email'=> $r['email'],
                    
    'text'=> nl2br(htmlspecialchars($r['text'])),
                );
                
    $results[] = $tmp
    Zuletzt geändert von schnidelwutz; 12.01.2005, 18:18.

  • #2
    erstmal musst du die verschiedenen Fälle unterscheiden wonach gesucht wird.
    Sonnst zitiere ich nen mal nen Post von inside-php.de
    Allerdings ist diese 'like' Suche mehr als simpel.... wäre der 'text' also zum Beispiel 'ein' (dummes Beispiel) würde auch 'wein', 'weinhändler', 'einfach' oder auch nur 'ein' in der Spalte feld gefunden werden....ist also unter Umständen ziemlich ungenau.

    Ein anderes Problem ergibt sich wenn 'text' aus 2 oder mehr Worten besteht....denn dann wird man das was im select hinter where steht dynamisch zusammensetzen und mit OR/AND verknüpfen müssen.

    Code:
    select daten from irgendwo where `feld` like '%ein pferd%'
    ...findet also nur datensätze in denen genau die folge 'ein pferd' vorkommt...aber zB keinen Datensatz in dem steht 'ein wildes pferd'...

    das würde man dann ändern in...

    Code:
    select daten from irgendwo where `feld` like '%ein%' or `feld` like '%pferd%'
    ###wenn einer der Begriffe im Datensatz vorkommen soll bzw.

    Code:
    select daten from irgendwo where `feld` like '%ein%' and `feld` like '%pferd%'
    ###wenn beides im datensatz vorkommen muss.

    Ein anderes Problem dieser 'like' Suchen ist die schlechte Performance sobald die Datenbank grösser wird.
    Ein Index ist das was eine mysql-Datenbank schnell macht...und genau der kann von mysql nicht genutzt werden bei like '%suchbegriff%'...
    Ein Index würde nur genutzt werden bei like 'suchbegriff%' (wenn also der Inhalt der spalte mit suchbegriff anfängt; egal was folgt)...das ist aber nicht praktikabel für eine Suchfunktion.

    Generell halte ich für Spalten in denen häufiger gesucht wird einen Volltext-Index am besten....kannst du lesen hier ...

    Allerdings hat auch die Volltextsuche einen entscheidenden Nachteil...die Länge des Suchbegriffes ist auf min. 4 Zeichen (nach 'php' zB könnte man nicht suchen) festgelegt...ausser man kompiliert mysql neu und legt einen kleineren Wert fest....

    Die beste Lösung ist also meiner Meinung nach eine Kombination aus Volltext- und Like-Suche... schau dir aber erstmal die Volltextsuche im mysql Manual an und verstehe wie die funktioniert.... dann gehts hier weiter im Text...
    l

    Kommentar


    • #3
      äääm wo hört jetzt das zitat auf und wo fängst du wieder an?

      Kommentar


      • #4
        Original geschrieben von schnidelwutz
        äääm wo hört jetzt das zitat auf und wo fängst du wieder an?
        spielt das eine Rolle ?

        Ich denke du hast jetzt ein paar Hausaufgaben zu erledigen.....
        [color=blue]MfG Payne_of_Death[/color]

        [color=red]Manual(s):[/color] <-| PHP | MySQL | SELFHTML |->
        [color=red]Merke:[/color]
        [color=blue]Du brauchst das Rad nicht neu erfinden ! [/color]<-ForumSuche rettet Leben-> || <-Schau in den Codeschnippsels->

        Murphy`s Importanst LAWS
        Jede Lösung bringt nur neue Probleme
        Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht.
        In jedem kleinen Problem steckt ein großes, das gern raus moechte.

        Kommentar


        • #5
          der erste satz ist von mir, alles andere ist das Zitat,
          da es in dem Thread nie zu einer Lösung kam weil der Fragestellende sich da zu viel vorgenommen hatte kann ich dir auch nciht wirklich eine komplette lösung dafür geben, vllt. kannst du aber mit dem Ende etwas Anfangen:
          http://www.inside-php.de/board/topic-245.0.html

          Kommentar


          • #6
            öööm.....ich hab auch so das gefühl, dass das was ich brauche diese volltextsuche ist....gibts da auch irgendwo lektüre für leute, die nicht studiert haben? weil auf der mysql-referenz muss man ja schon fast fremdwörter studiert ham....

            Kommentar


            • #7
              OffTopic:
              fremdwörter studiert man nicht, fremdwörter liest/schlägt man nach

              *scnr*
              Ich denke, also bin ich. - Einige sind trotzdem...

              Kommentar


              • #8
                @mrhappiness: habsch jetz gemacht
                also ich glaub ich hab jetzt verstanden, warum die volltextsuche für mich das beste ist, aber ich sitz jetz irgendwie am schlauch, wie ich das auch ausgeben soll...also ich hab jetz den query genau nach dem muster wie in der referenz und wollte das dann als array übergeben--> mag er nich...

                Kommentar


                • #9
                  dann schau was mysql dir sagt
                  echo mysql_error();

                  Kommentar


                  • #10
                    ich hab zwar den index angelegt, aber ich bekomme trotzdem diesen error:
                    PHP-Code:
                     SQL-Befehl 

                    SELECT FROM artikel WHERE MATCH (nameAGAINST ('Berlin'LIMIT 030

                    MySQL meldet
                    :

                    Can't find FULLTEXT index matching the column list 
                    kann es sein, dass ich den index falsch angelegt habe?
                    im phpmyaddy schaut der index so aus:
                    PHP-Code:
                       FULLTEXT KEY titel (text,autor,name,trackliste,interpret,preis
                    hoffe, jemand kann mir helfen...

                    Kommentar


                    • #11
                      Original geschrieben von schnidelwutz
                      Can't find FULLTEXT index matching the column list
                      was ist daran so schwer zu kapieren?

                      du hast keinen fulltext-index über die spalte name ...
                      I don't believe in rebirth. Actually, I never did in my whole lives.

                      Kommentar


                      • #12
                        hilfe....ich dachte eigentich, dass ich den schon gemacht habe...hab ich auch...steht auch so im phpmyadmin...wahrscheinlich hab ich da was falsch gemacht...kannst du mir mal nen groben query sagen, wie ich auf die spalte nen fulltext mache?

                        Kommentar

                        Lädt...
                        X