Ankündigung

Einklappen
Keine Ankündigung bisher.

Wie Suchfunktion implementieren?

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

  • t.animal
    hat ein Thema erstellt Wie Suchfunktion implementieren?.

    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!

  • Papst
    antwortet
    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

    Einen Kommentar schreiben:


  • t.animal
    antwortet
    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!

    Einen Kommentar schreiben:


  • Papst
    antwortet
    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 ^^

    Einen Kommentar schreiben:


  • t.animal
    antwortet
    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 | 
    ⌊____|________|___________⌋

    Einen Kommentar schreiben:


  • agrajag
    antwortet
    Zitat von t.animal Beitrag anzeigen
    Aber dadurch multiplizieren sich doch die Datenbankabfragen mit 2?!
    Nein, dafür gibt es JOIN in SQL.

    Einen Kommentar schreiben:


  • t.animal
    antwortet
    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?!

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


  • t.animal
    antwortet
    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...

    Einen Kommentar schreiben:


  • Sven
    antwortet
    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.

    Einen Kommentar schreiben:


  • t.animal
    antwortet
    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.

    Einen Kommentar schreiben:


  • Sven
    antwortet
    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.

    Einen Kommentar schreiben:

Lädt...
X