2012-04-01 9 views
3

Ich arbeite an einer Webanwendung und brauche Hilfe bei einer Abfrage. Ich bin mit Volltext, das ist, wie es sieht:Sortieren nach Most gefunden MY_SQL Volltext

SELECT id, name, city, state, country, date 
FROM events_search 
WHERE MATCH(name, city, state, country) 
AGAINST ('$str') 

Wie man sehen kann ich einen Index bin mit, die den Namen, Stadt, Staat und Land enthält und mit einem String-Matching, dass der Benutzer eingibt. Diese Zeichenfolge kann eine beliebige Kombination der Felder enthalten, die ich gerade erwähnt habe. Also muss ich die Datenbank abfragen, die relevantesten Ergebnisse finden und sie dann dem Benutzer zeigen. Bis jetzt funktioniert es gut, aber nicht perfekt.

Zum Beispiel: wenn der Benutzer Miami Florida eingibt, sind die ersten 5 Ergebnisse in Miami und in anderen Städten in Florida. Die nächsten 5 sind in Miami Arizona (ich will das nicht zeigen), und nachdem ich mehr Ergebnisse bekommen werde, die in Florida und Miami (Florida) sind. Also, was ich tun möchte, ist das Feld, das gefunden wurde, mehr Male und zeigen Sie die Ergebnisse, die dieses Feld an der Spitze haben. In diesem Fall wird es Florida sein, da 70% der Ergebnisse Florida im Staatsgebiet haben.

Antwort

0

Fügen Sie Ihre Volltextsuche in die SELECT Klausel ein und Sie erhalten eine Punktzahl, wie relevant MySQL ist.

SELECT 
id, 
name, 
city, 
state, 
country, 
date, 
MATCH(name, city, state, country) AGAINST ('$str') AS relevancy 
FROM 
events_search 
WHERE 
MATCH(name, city, state, country) AGAINST ('$str') 
ORDER BY relevancy DESC 

Das macht die Abfrage nicht langsamer, der Optimierer prüft, dass es zweimal die gleichen Suchkriterien ist.

Mit der ORDER BY Klausel sollte Ihr "Miami Arizona" später als "Miami (Florida)" angezeigt werden.