2013-02-22 21 views
7

Ich habe ein Suchformular, das eine Site-Inhaltstabelle durchsucht, um entsprechende Ergebnisse zurückzuziehen.MySQL nach Relevanz sortieren

Ich möchte die Titel und Inhaltsfelder durchsuchen und Ergebnisse in der Reihenfolge der Relevanz zurückziehen. Dem Titel höchste Priorität geben.

Sagen wir

intID | strTitle | txtContent 

1  | Smith John | Lorem Ipsum 
2  | Lorem Ipsum | Lorem John Smith Ipsum 
3  | John Smith | Lorem Ipsum Lorem Ipsum 
4  | Lorem Ipsum | Lorem Ipsum Lorem Ipsum 
5  | Lorem Ipsum | Lorem Ipsum Smith John 

Und Sie waren auf der Suche nach "John Smith" die Ergebnisse sollten wieder in der Größenordnung von 3,2,1,5

eine Tabelle (tblContent) von

hatte Wie Ist das möglich?

+0

Wie groß ist die Tabelle? – Achrome

+0

~ 150 Zeilen derzeit. Es ist eine ziemlich kleine Seite, so wird nie in der Nähe sogar 1k Reihen bekommen – Fraser

+0

Siehe, vielleicht könnte es helfen: http://StackOverflow.com/A/35512410/1673161 –

Antwort

16

ich konnte ziemlich Stelle mit diesem erhalten auf:

SELECT *, 
((1.3 * (MATCH(strTitle) AGAINST ('+john+smith' IN BOOLEAN MODE))) + (0.6 * (MATCH(txtContent) AGAINST ('+john+smith' IN BOOLEAN MODE)))) AS relevance 
FROM content 
WHERE (MATCH(strTitle,txtContent) AGAINST ('+john+smith' IN BOOLEAN MODE)) 
ORDER BY relevance DESC 
+1

Nice Verwendung von übereinstimmen. – Achrome

+1

Warum, danke :) – Fraser

+0

Was ist der Einsatz von 0,6 ??? Bitte verweisen Sie mich, wo ich RTM kann. Danke – Karma

0

Was ist mit etwas entlang der Linien von

SELECT INT(id), strTitle, txtContent 
FROM tblContent 
WHERE name like '%John%' 
GROUP BY strTitle 
ORDER BY CASE WHEN strTitle like 'John %' THEN 0 
      WHEN strTitle like 'John%' THEN 1 
      WHEN strTitle like '% John%' THEN 2 
      ELSE 3 
     END, strTitle 
+0

Das Problem ist, dass die Suchkriterien von einem Benutzer gefüllt werden soll Sucheingabe, so dass die richtige Lösung in der Lage sein muss, mit allem fertig zu werden, was der Benutzer darauf wirft – Fraser

+0

Oh richtig, dang nicht so sicher, sorry! – Sim

4

Es ist wahrscheinlich eine effizientere Art und Weise und die Suchzeichenfolge gegeben könnte mehr als zwei Worte, dies wahrscheinlich nicht möglich ist, aber ich würde gerne etwas tun

ORDER BY CASE 
WHEN strTitle LIKE '%John Smith%' THEN 1 
WHEN txtContent LIKE '%John Smith%' THEN 2 
WHEN strTitle LIKE '%Smith John%' THEN 3 
WHEN txtContent LIKE '%Smith John%' THEN 4 
ELSE 5 END 
+0

Ich mag die Idee, aber wie Sie erwähnen, die Suche könnte eine unbegrenzte Anzahl von Wörtern sein, wie es von einem Sucheingang kommt – Fraser

+0

@Fraser sollten Sie nie Benutzer eine Möglichkeit von nichts unbegrenztes geben. Wie auch immer, ich sehe kein Problem mit der Abfrage contatenate :) (Sie können dynamische Platzhalter verwenden, Benutzerdaten dynamisch bereinigen und Abfragen dynamisch verketten :) –

+1

Dies würde zu einer Abfrage mit sehr geringer Leistung führen. – Amir

3

mysql Volltext s Earche ist eine gute Sache, aber es hat eine Grenze von mindestens 4 Zeichen Wort zu indizieren. Das Limit kann zwar geändert werden, aber das Ändern von Servervariablen ist nicht in allen Szenarien möglich. In einer solchen Situation, empfehle ich die Lösung, um von Fall vorgeschlagen

select 
    * 
from 
mytable a 
WHERE 
    (a.title like 'somthing%' 
    OR a.title like '%somthing%' 
    OR a.title like 'somthing%') 
ORDER BY case 
WHEN a.title LIKE 'somthing%' THEN 1 
WHEN a.title LIKE '%somthing%' THEN 2 
WHEN a.title LIKE '%somthing' THEN 3 
ELSE 4 END;