Ankündigung

Einklappen
Keine Ankündigung bisher.

Wie Suchfunktion implementieren?

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

  • Wie Suchfunktion implementieren?

    Hallo!
    Ich möchte für eine Schülerzeitung eine Suchfunktion in die Website einbauen. Bevor ich jetzt irgendwie anfange wollte ich fragen, was denn die geringste Serverlast bzw schnellsten Ergebnisse liefert:
    1. Beim Abschicken/Ändern eines Artikels werden alle Worte in eine Tabelle geschrieben und die entsprechende Artikelid gespeichert (so machts glaub ich phpbb)
    2. Beim Suchen wird der MYSQL-Parameter LIKE verwendet: LIKE '%Suchwort%'
    3. Irgendwas anderes

    Vielen Dank schonmal!


  • #2
    Ohne mal die Struktur deiner Datenbank zu kennen, würde ich dir folgendes Raten:

    1. Eine Tabelle anlegen in der Suchbegriffe, Modulname (z.B. News, Content, wie auch immer), ID(s)
    2. Filter einbauen ( http://wortschatz.uni-leipzig.de/Papers/top1000de.txt )
    Jedes Mal wenn eine News geschrieben wird oder eine neue Seite angelegt wird, wird der zu lesende Inhalt in Worte zerlegt und dann in die Tabelle mit Wort, Modul und ID hinzugefügt oder bereits vorhandene Einträge aktualisiert.
    3. Das Ganze optimieren durch Suchanalysen. Häufiger angeklickte Suchresultate höher gewichten und die Suchergebnisse cachen. Erst dann neu anlegen, wenn neue Inhalte angelegt, bearbeitet oder gelöscht werden.

    Kommentar


    • #3
      Vielen Dank für die Wortliste! Die ist schonmal Gold wert!

      Eigentlich hatte ich den von dir beschriebenen Weg vor, doch dann sind mir Zweifel gekommen: Sieht meine Tabelle so aus:
      Code:
      ⌈‾‾‾‾|‾‾‾‾‾‾|‾‾‾‾‾‾‾‾‾‾⌉
      | ID | WORT | KLICKZAHL| 
      ⌊____|______|__________⌋
      Dann muss ich zwingend eine weitere anlegen mit:
      Code:
      ⌈‾‾‾‾|‾‾‾‾‾‾‾‾|‾‾‾‾‾‾‾‾‾‾‾⌉
      | ID | WORTID | ARTIKELID | 
      ⌊____|________|___________⌋
      Verlangsamt das nicht die ganze Suche? Ich mein, klar: Wir reden "nur" von einer Schülerzeitung mit ein paar hundert Artikeln und net von großen Tageszeitung oder so... aber wenn ichs mach, will ichs gleich richtig machen.

      Kommentar


      • #4
        Ich kann den Weg mit zwei Tabellen leider noch nicht nachvollziehen, weshalb du einen zweiten Index anlegen möchtest, in dem Zuordnungs-IDs enthalten sind, aber in keiner direkten Verknüpfung zur eigentlichen Suche stehen. Ich versuche meine Variante mit nur einem Modul und keinem Cache und keiner Optimierung der Suchanfragen an Hand eines Beispiels zu erläutern:

        ID | WORT | ARTID |

        ID = Index
        Wort = ist klar
        Art-ID = hier verstecken sich jetzt entweder nur eine Zahl oder mehrere getrennt durch beispielsweise ein Semikolon. Dies sind die ID's (Also hoffentlich deine vorhandenen primären Schlüssel) der geschriebenen Artikel.

        Beim Speichern eines Artikels werden mit der Wortliste Worte gefiltert und lowercase in die Datenbank geschrieben plus der Artikel-ID.

        Wenn jemand sucht -> lowercase konvertieren, mit LIKE vergleichen, anhand der Art-ID(s) Links generieren zu den Artikeln. Und hier kannst du dir ja ganz einfach eine Funktion schreiben zu heraussuchen des Titels und ähnlichem.

        Kommentar


        • #5
          Ja, das ist mir durchaus klar, wie das gemeint war. Nur scheint mir das ein wenig unflexibel?! Wenn ich ein Artikel gelöscht würde, müsste ich eine rießige Anzahl von Strings trennen (explode()) und wieder zusammensetzen wobei jeweils die gelöschte ID herausgenommen würde...

          EDIT: Argh... als ichs abgeschickt hab is mir eingefallen, dass es einfach mit st_replace ginge... ich werds einfach mal so machen wie du vorgeschlagen hast... schließlich hab ich mich noch nie damit auseinandersetzen müssen...
          Du hast natürlich recht, dass cachen etc sinnvoll wäre, doch leider ist das nicht umsetzbar... hab die Seite von einem Bekannten übernommen, der (imho) irgendwie recht eigenartige Vorgehensweisen besitzt... das Auslesen von auszuführendem php-Code aus einer Datenbank bspw...

          Kommentar


          • #6
            die 1 Tabellen Lösung geht allerdings bei vielen Daten sehr zu lasten der Performance.
            kann diesen Artikel empfehlen:
            Normalisierung (Datenbank) - Wikipedia

            Kommentar


            • #7
              Argh :P... was denn jetzt?

              Meine Version entspricht doch dann der 2.NF?! Würdest du dann also das empfehlen? Aber dadurch multiplizieren sich doch die Datenbankabfragen mit 2?!

              Kommentar


              • #8
                Zitat von t.animal Beitrag anzeigen
                Aber dadurch multiplizieren sich doch die Datenbankabfragen mit 2?!
                Nein, dafür gibt es JOIN in SQL.
                Create your own quiz show.

                Kommentar


                • #9
                  Ui! Das kannte ich noch gar nicht... das hätt ich schon oft gut gebrauchen können -.-... Danke!
                  Demnach (nur um zu checken, ob ich's verstanden hab) würde meine Abfrage beispielhaft lauten:

                  SELECT articleid FROM wordlist, articlelist WHERE wordlist.ID = articlelist.wordid

                  Wenn folgende Tabellen existieren:

                  Wordlist (mögliche Suchbegriffe, Klickhäufigkeit auf Ergebnis mit (oder Suchhäufigkeit nach, muss ich noch sehen) diesem Wort und eine eindeutige ID)
                  Code:
                  ⌈‾‾‾‾|‾‾‾‾‾‾|‾‾‾‾‾‾‾‾‾‾⌉
                  | ID | WORD| KLICKCOUNT| 
                  ⌊____|______|__________⌋
                  Articlelist (ID eines Artikels, ID eines darin vorkommenden möglichen Suchwortes und eine eindeutige ID)
                  Code:
                  ⌈‾‾‾‾|‾‾‾‾‾‾‾‾|‾‾‾‾‾‾‾‾‾‾‾⌉
                  | ID | WORDID | ARTICLEID | 
                  ⌊____|________|___________⌋

                  Kommentar


                  • #10
                    Code:
                    SELECT `articleid` 
                    FROM `wordlist`
                    INNER JOIN `articlelist` ON `articlelist`.`wordid` = `wordlist`.`id`
                    WHERE `wordlist`.`word` IN('word1','word2',....,'wordN')
                    so würde ichs basteln steht mir auch bald bevor ^^

                    Kommentar


                    • #11
                      OmG. Ich muss mir wirklich so ein mysql-Buch besorgen...
                      Alles, was ich mir beigebracht hab, basiert auf Tutorials... Aber mein Wissen ist noch so extrem lückenhaft. Wenigstens verstehe ich deine Abfrage ... Danke!

                      Kommentar


                      • #12
                        und ich habe einen Fehler gemacht bei der Abfrage

                        es müsste andersherum sein.. Abfragen von der Atikelliste, nicht Wortliste und die Wortliste per Join abfragen, sonst kommt nur ein Artikel pro Wort heraus

                        Kommentar

                        Lädt...
                        X