Wie geht das mit ner Suchmaschine

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

  • Wie geht das mit ner Suchmaschine

    hab in der Suche nix gefunden.

    Mich interressiert eigentlich ganz allgemein wie das mit Suchmaschienen geht.

    ich hab z.B. forenbeiträge in ner Datenbank. Jetzt kann ich natürlich mit LIKE die Beiträge etc. durchsuchen und anzeigen. Sowas kommt allerdings bestimmt sehr schnell an seine Grenzen.

    Jetzt hab ich mir überlegt, alle Wörter aus dem geposteten Text zu filtern, für jedes neu gefundene Wort wird ein neuer Datensatz angelegt, ist das wort schon in der tabelle, wird die id des beitrags in das zugehörige Feld eingefügt.

    Mit der Zeit müsste so eine Tabelle entstehen, in der so ziemlich alle Wöter drinstehn und in welchen posts sie vorkommen. Muss also nur noch das wort aus der tabelle filtern und hab auf einen Rutsch ne liste wo das Wort vorkommt.

    Hat jemand Ahnung von sowas, ich möchte nicht dumm sterben?
    Zuletzt geändert von kressevadder; 09.08.2003, 16:46.
    Cocoa Entwicklertraining - Alles für die Apfelzucht

  • #2
    Vorweg:
    Ganze Wörter kannst du auch mit einem FULLTEXT-Index und MATCH ... AGAINST finden.
    Für das Finden von Teilwörtern gibt es momentan leider nur LIKE, aber das nimmt bei umfangreichen Tabellen so viele Resourcen in Anspruch, dass ohne weiteres der Server abschmieren kann.

    Um deine Idee zu verwirklichen, brauchst du mindestens eine zusätzliche Tabelle:
    Code:
    create table suchbegriff
    (
      WORT varchar(255),
      FK (Typ = Primärkey der Text-Tabelle),
      index (WORT),
      index (FK),
      unique (WORT, FK)
    )
    Wenn ein Suchbegriff nicht gefunden wird, fügst du einen Datensatz mit FK=0 ein.

    Text einfügen / bearbeiten:
    PHP-Code:
    select distinct WORTmax(FK), count(*) from suchbegriff
    while (list($wort$maxfk$anzahl) = mysql_fetch_row(...))
    {
      if (
    $wort im Text enthalten)
      {
        if (
    0==$maxfk// bisher 0-Datensatz: FK ändern
          
    update suchbegriff set FK=$textid where WORT='$wort'
        
    else // sonst: neue Fundstelle einfügen
          
    insert into suchbegriff (WORTFKvalues '$wort'$textid;
          
    /* wenn das fehlschlägt, ist der schon gespeichert */
      
    }
      elseif (
    1==$anzahl)
      {
        if (
    $maxfk==$textid// einziges Vorkommen war aktueller Text
          
    update suchbegriff set FK=0 where WORT='$wort'
      
    }
      else 
    // es gibt noch andere Vorkommen
        
    delete from suchbegriff where FK=$textid and WORT='$wort'

    Suche:
    PHP-Code:
    select FK from suchbegriff where WORT='$wort'
    if (mysql_num_rows(...)) // Suchwort schon gespeichert
    {
      
    $gefunden_ids = array();
      while (list(
    $id) = mysql_fetch_row(...))
        
    $gefunden_ids[] = $id;
      if (
    0==$gefunden_ids[0])
        echo 
    'schon mal gesucht; nicht vorhanden';
      else
        echo 
    'Suchbegriff schon gespeichert in ',
          
    implode(', '$gefunden_ids);
    }
    else
    {
      
    normale Suche in allen Datensätzen:
        if (
    gefunden)
          
    insert into suchwort (WORDFKvalues ('$wort'$textid)
      if(
    nirgends gefunden)
        
    insert into suchwort (WORDFKvalues ('$wort'0)

    mein Sport: mein Frühstück: meine Arbeit:

    Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

    Kommentar


    • #3
      Das nenn ich mal ne genaue Antwort. Ich hab inzwischen auch angefangen sowas zu basteln - ist allerdings etwas diletantischer als deine Variante Ich hab alle Worte in ner Tabelle und die "Matches" in ner weiteren. Wird ein Wort gesucht > SELECT * FROM wortetabelle > wenn leer kein eintrag; wenn Wort vorhanden> SELECT * FROM matsches WHERE wordid=id_vorige_abfrage .

      Funktioniert jedenfalls. Hab übrigens auch mal in meinem Forum geschaut (phpBB), da gehts genauso und dass die "matches Tabelle" mehr als 40.000 Einträge hat scheint nicht zu stören.

      Danke für deine Antwort - Manfred
      Cocoa Entwicklertraining - Alles für die Apfelzucht

      Kommentar


      • #4
        Hallo,

        select distinct WORT, max(FK), count(*) from suchbegriff
        falls Du mal muse hast könntest Du mir das mit dem FK vielleicht mal erläutern, aus der Bedienungsanleitung bin ich nicht schlau geworden, bzw hab nix gefunden (fk ist als Suchbegriff zu kurz), oder vielleicht ein Link zum Dummy Torturial.

        Ausser abbunkern und auslesen krig ich bisher nicht viel mehr mit mysql hin. Mein Script hat daher auch entsprechend viele DB-Abfragen.

        Gruss
        Cocoa Entwicklertraining - Alles für die Apfelzucht

        Kommentar


        • #5
          FK ist erstmal nur ein Spaltenname, nebenbei auch noch ein geläufiges Kürzel for "Foreign Key".
          Damit ist eine Spalte gemeint, die auf den Primary Key einer anderen Tabelle verweist - in deinem Fall auf die Tabelle mit den Texten.

          Die Query im Detail:
          select distinct WORT, max(FK), count(*) from suchbegriff [COLOR=red]group by WORT
          (den letzten Teil hatte ich oben vergessen)[/COLOR]

          Zu jedem in der Tabelle gespeicherten WORT erhältst den Maximal-Wert von FK und die Anzahl der Vorkommen ...
          Ist das Wort bisher nicht vorhanden, so ist max(FK)=0 und count(*)=1
          und das wird in den folgenden if-Abfragen ausgenutzt.

          Tipp: Lies mal den Abschnitt 7.3.6 Funktionen zur Benutzung bei GROUP BY-Klauseln im MySQL-Handbuch.
          mein Sport: mein Frühstück: meine Arbeit:

          Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

          Kommentar


          • #6
            Dank' dir
            Cocoa Entwicklertraining - Alles für die Apfelzucht

            Kommentar

            Lädt...
            X