effektive select anfrage fuer suchfunktion

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

  • effektive select anfrage fuer suchfunktion

    hi,

    ich bastle hier an einem newssystem mit suchfunktion in den news,
    es ist ein eingabefeld (vgl. google) wo man dann stichwoerter oder komplette titel oder dergleichen eingeben koennen sollte...

    LIKE faellt schon mal aussen vor, da ich so ja nicht nach schlagwoertern suchen kann die nicht unmittelbar hintereinanderstehen,
    also hab ich MATCH AGAINST genommen
    (nachdem ich die betreffenden felder fulltext indiziert hab)

    jedoch klappt die suche irgendwie nur für das erste wort welches in das input feld als suchbegriff eingegeben wird und auch dies nicht fuer alle...

    SELECT * FROM news WHERE MATCH text_news AGAINST ('$search') OR MATCH title_news AGAINST ('$search')

    laut php manual muesste doch match against dann in der uebergebenen search variable auch " " mit komplettem titel usw unterstuetzen...

    bis jetz is jedenfalls meine suche nicht sehr effektiv

    ideen ??

  • #2
    Re: effektive select anfrage fuer suchfunktion

    Original geschrieben von bender_79
    SELECT * FROM news WHERE MATCH text_news AGAINST ('$search') OR MATCH title_news AGAINST ('$search')
    zweimal MATCH AGAINST für unterschiedliche felder, aber identischem suchtext mit OR zu verbinden, ist schon mal überflüssig.

    SELECT * FROM news WHERE MATCH (text_news, title_news) AGAINST ('$search')



    nach was für begriffen hast du denn zu suchen probiert?

    beachte auch folgenden auszug aus dem manual:

    MySQL benutzt einen sehr einfachen Parser, um Text in Wörter zu zerlegen. Ein ``Wort'' ist jede Folge von Buchstaben, Zahlen, `'' und `_'. Jedes ``Wort'', das in der Liste der Stopwords vorkommt oder einfach nur zu kurz ist (3 Zeichen oder weniger), wird ignoriert.

    Jedes korrekte Wort in der Textsammlung und in der Anfrage wird nach seiner Signifikanz in der Anfrage oder der Textsammlung gewichtet. Daher hat ein Wort, dass in vielen Dokumenten vorkommt, ein geringeres Gewicht (und kann sogar 0 Gewicht haben), weil es in dieser bestimmten Textsammlung einen geringen semantischen Wert hat. Ansonsten, wenn das Wort selten vorkommt, erhält es ein höheres Gewicht. Die Gewichte der Wörter werden anschließend kombiniert, um die Relevanz der Zeile zu berechnen.

    Solch eine Technik funktioniert am besten bei großen Textsammlungen (in der Tat wurde sie sorgfältig darauf optimiert). Bei sehr kleinen Tabellen spiegelt die Wortverteilung nicht adäquat seinen semantischen Wert wider, so dass dieses Modell manchmal bizarre Ergebnisse ergeben kann:

    mysql> SELECT * FROM artikel WHERE MATCH (titel,artikeltext) AGAINST ('MySQL');
    Empty set (0.00 sec)

    Die Suche nach dem Wort MySQL erzeugt im obigen Beispiel keine Ergebnisse. Das Wort MySQL ist in mehr als der Hälfte der Zeilen vorhanden und wird deshalb als Stopword betrachtet (eins mit dem semantischen Wert 0). Das ist in der Tat das gewünschte Verhalten - eine natürlichsprachige Anfrage sollte bei einer 1 GB großen Tabelle nicht jede zweite Zeile zurückgeben.



    besonders das fett markierte zum thema STOPWORDS beachten!
    I don't believe in rebirth. Actually, I never did in my whole lives.

    Kommentar


    • #3
      zweimal MATCH AGAINST für unterschiedliche felder, aber identischem suchtext mit OR zu verbinden, ist schon mal überflüssig.

      SELECT * FROM news WHERE MATCH (text_news, title_news) AGAINST ('$search')
      hatte ich auch gedacht, aber wenn ich's so mache spuckt er immer aus dass das sql statement muell is,
      mit meiner or anweisung laeuft es dagegen...
      keine ahnung warum

      uebrigens hatte ich auch haeufig in meinen beispielen nach 3stelligen woertern gesucht...

      also stellt match against wohl schon das optimale fuer mein vorhaben dar, nur muss ich es halt noch optimieren...

      werd ich mich mal hiermit befassen:
      http://www.mysql.com/doc/de/Fulltext_Fine-tuning.html

      ciao

      Kommentar

      Lädt...
      X