Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie kann ich die Relevanz der MySQL-Volltextsuche manipulieren, um ein Feld "wertvoller" als ein anderes zu machen?

Erstellen Sie drei Volltextindizes

  • a) eine in der Keyword-Spalte
  • b) eine in der Inhaltsspalte
  • c) eine für Keyword- und Content-Spalte

Dann Ihre Frage:

SELECT id, keyword, content,
  MATCH (keyword) AGAINST ('watermelon') AS rel1,
  MATCH (content) AGAINST ('watermelon') AS rel2
FROM table
WHERE MATCH (keyword,content) AGAINST ('watermelon')
ORDER BY (rel1*1.5)+(rel2) DESC

Der Punkt ist, dass rel1 gibt Ihnen die Relevanz Ihrer Suchanfrage einfach im keyword an Spalte (da Sie den Index nur für diese Spalte erstellt haben). rel2 macht dasselbe, aber für den content Säule. Sie können diese beiden Relevanzwerte jetzt mit beliebiger Gewichtung addieren.

Sie verwenden jedoch keinen dieser beiden Indizes für die eigentliche Suche. Dazu verwenden Sie Ihren dritten Index, der sich auf beiden Spalten befindet.

Der Index auf (Stichwort,Inhalt) steuert Ihre Erinnerung. Aka, was zurückgegeben wird.

Die zwei separaten Indizes (einer nur für Keywords, einer nur für Inhalt) steuern Ihre Relevanz. Und Sie können hier Ihre eigenen Gewichtungskriterien anwenden.

Beachten Sie, dass Sie eine beliebige Anzahl verschiedener Indizes verwenden können (oder die Indizes und Gewichtungen, die Sie zum Zeitpunkt der Abfrage verwenden, möglicherweise basierend auf anderen Faktoren variieren ... suchen Sie nur nach Schlüsselwörtern, wenn die Abfrage ein Stoppwort enthält ... verringern Sie die Gewichtungsverzerrung für Schlüsselwörter, wenn die Suchanfrage mehr als 3 Wörter enthält ... etc).

Jeder Index verbraucht Speicherplatz, also mehr Indizes, mehr Festplatte. Und im Gegenzug ein höherer Speicherbedarf für MySQL. Außerdem dauert das Einfügen länger, da Sie mehr Indizes aktualisieren müssen.

Sie sollten die Leistung für Ihre Situation bewerten (achten Sie darauf, den MySQL-Abfrage-Cache für das Benchmarking zu deaktivieren, da sonst Ihre Ergebnisse verzerrt werden). Das ist nicht google-effizient, aber es ist ziemlich einfach und "out of the box" und es ist mit ziemlicher Sicherheit viel besser als Ihre Verwendung von "like" in den Abfragen.

Ich finde, es funktioniert wirklich gut.