Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Googlesuche realisieren

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von MWagner, 14 Mai 2017.

  1. MWagner

    MWagner Neuer Benutzer

    Hallo zusammen!


    Ich schreibe gerade an einer kleinen Anwendung, mit der ich Webseiten die mich interessieren Archivieren kann. In diesem Archiv, möchte ich eine Suche ähnlich wie Google realisieren. Bei mehreren Suchbergriffen, sollen hier die Datensätze als erstes gelistet werden, welche die meisten Wörter aus dem Suchtext vorkommen. Die Tabelle sieht folgendermaßen aus:

    CREATE TABLE IF NOT EXISTS `web` (
    `titel` varchar(80) COLLATE utf8_bin NOT NULL,
    `url` varchar(250) COLLATE utf8_bin NOT NULL,
    `text` longtext COLLATE utf8_bin NOT NULL,
    `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `id` int(11) NOT NULL,
    `accessid` int(11) NOT NULL,
    `mandantcreateid` int(11) NOT NULL,
    `mandantchangeid` int(11) NOT NULL,
    `mandantdeleteid` int(11) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

    Aktuell durchsuche ich so:

    Select id, titel, text where text like '%suchbegriff1%' or text like '%suchbegriff2%' or titel like '%suchbegriff1%' or titel like '%suchbegriff2%';

    Hier bekomme ich allerdings das Ergebnis unsortiert. Wie kann man die gelieferten Datensätze so sortieren, dass sie nach der Anzahl der Treffer absteigend geliefert werden?

    Danke schon einmal für die Unterstützung!

    Michael
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Normal. Ohne ein ORDER BY hast Du halt keine Sortierung. Wenn Du nach Anzahl der Treffer zählen willst (vermutlich eher nach dem Ranking der Treffer) solltest Du passende Funktionen dafür nutzen, die das auch liefern können, was Du willst. ts_rank() (ts steht für text search) könnte das z.B. sein. Weiß aber nicht, ob MySQL sowas hat & kann.

    PostgreSQL: Documentation: 9.6: Text Search Functions and Operators
     
  3. drdimitri

    drdimitri Datenbank-Guru

    Walter gefällt das.
  4. MWagner

    MWagner Neuer Benutzer

    Vielen Herzlichen Dank für den Hinweis auf die Funktionen MATCH() und AGAINST(). Damit kann man so etwas wirklich sehr leicht realisieren und wenn ich früher davon gewusst hätte, wäre mir viel Arbeit erspart geblieben, da ich mir im Moment das SQL-Statement mühsam per PHP zusammenbastele. Leider bringt mich das aber nicht so recht weiter, da die relevanten Suchergebnisse bei dieser Methode genauso unsortiert im Ergebnis geliefert werden.
    Ich habe mir jetzt überlegt eine temporäre Tabelle anzulegen und pro Suchbegriff die ID des gefundenen Datensatzes dort zu speichern. Abschließend hätte ich dann die Möglichkeit über eine Gruppierung und die Anzahl der Treffer zu sortieren.
    Ich werde das einmal ausprobieren und hoffe, das mit dieser Lösung nicht zu all zu viel Performance verbraten wird. Ich habe mit temporäre Tabellen leider noch keine Erfahrung. Falls das eine schlechte Idee ist oder jemand eine bessere Lösung hat, wäre ich für einen Hinweis sehr dankbar.

    Viele Grüße

    Michael
     
  5. MWagner

    MWagner Neuer Benutzer

    Dank Freund Google habe ich doch noch etwas besseres gefunden. Hier ein Beispiel, wie man mit MATCH() und AGAINST() die Relevanz berücksichtigen kann.

    SELECT pages.*,
    MATCH (head, body) AGAINST ('some words') AS relevance,
    MATCH (head) AGAINST ('some words') AS title_relevance
    FROM pages
    WHERE MATCH (head, body) AGAINST ('some words')
    ORDER BY title_relevance DESC, relevance DESC

    -- alternatively:
    ORDER BY title_relevance + relevance DESC


    Vielen Dank für die Unterstützung!
     
    Walter, ukulele und drdimitri gefällt das.
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden