Googlesuche realisieren

MWagner

Neuer Benutzer
Beiträge
3
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
 
Werbung:
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?

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
 
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
 
Werbung:
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!
 
Zurück
Oben