Okay, also versuche ich, eine Volltextsuche in mehreren Spalten durchzuführen, so etwas Einfaches:
SELECT * FROM pages WHERE MATCH(head, body) AGAINST('some words' IN BOOLEAN MODE)
Jetzt möchte ich nach Relevanz ordnen (wie viele der Wörter werden gefunden?), Was ich mit so etwas machen konnte:
SELECT * , MATCH (head, body) AGAINST ('some words' IN BOOLEAN MODE) AS relevance
FROM pages
WHERE MATCH (head, body) AGAINST ('some words' IN BOOLEAN MODE)
ORDER BY relevance
Jetzt kommt der Teil, in dem ich mich verliere. Ich möchte die Relevanz in der head
Spalte priorisieren .
Ich denke, ich könnte zwei Relevanzspalten erstellen , eine für head
und eine für body
, aber zu diesem Zeitpunkt würde ich dreimal ungefähr die gleiche Suche in der Tabelle durchführen, und für das, was ich für diese Funktion mache, ist die Leistung wichtig, da die Die Abfrage wird zusammengefügt und mit anderen Tabellen abgeglichen.
Meine Hauptfrage lautet also : Gibt es eine schnellere Möglichkeit, nach Relevanz zu suchen und bestimmte Spalten zu priorisieren? (Und als Bonus wird möglicherweise sogar die Relevanz gezählt, wie oft die Wörter in den Spalten vorkommen?)
Anregungen oder Ratschläge wären toll.
Hinweis: Ich werde dies auf einem LAMP-Server ausführen. (WAMP in lokalen Tests)
quelle
Antworten:
Dies kann die erhöhte Relevanz für das gewünschte Kopfteil erhöhen. Es wird es nicht verdoppeln, aber es könnte möglicherweise gut genug für Sie sein:
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
Eine Alternative, die Sie auch untersuchen möchten, wenn Sie die Flexibilität haben, die DB-Engine zu wechseln, ist Postgres . Es ermöglicht, das Gewicht der Operatoren festzulegen und mit dem Ranking herumzuspielen.
quelle
MATCH
Anweisungen aufgrund der internen Funktionsweise von MySQL keinen zusätzlichen Aufwand bedeutet .ALTER TABLE talk_webpages ADD FULLTEXT(head)
undALTER TABLE talk_webpages ADD FULLTEXT(head, body)
Nur hinzufügen, wer vielleicht braucht. Vergessen Sie nicht, die Tabelle zu ändern!
ALTER TABLE table_name ADD FULLTEXT(column_name);
quelle
TABLE_CATALOG
= 'def' ANDTABLE_SCHEMA
= DATABASE () ANDTABLE_NAME
= 'Tabellenname' ANDINDEX_NAME
= 'Indexname';Ich habe es noch nie getan, aber es scheint so
Sollte Streichhölzern im Kopf ein doppeltes Gewicht geben.
Lesen Sie einfach diesen Kommentar auf der Dokumentenseite. Ich dachte, er könnte für Sie von Wert sein:
SELECT MATCH('Content') AGAINST ('keyword1 keyword2') as Relevance FROM table WHERE MATCH ('Content') AGAINST('+keyword1+keyword2' IN BOOLEAN MODE) HAVING Relevance > 0.2 ORDER BY Relevance DESC
Es scheint also, dass Sie sich keine Sorgen machen müssen, die Volltextsuche zweimal aufzurufen, obwohl Sie dennoch "EXPLAIN verwenden sollten, um dies zu beweisen".
quelle
Ich habe auch nur damit rumgespielt. Eine Möglichkeit, zusätzliches Gewicht hinzuzufügen, ist der Bereich ORDER BY des Codes.
Wenn Sie beispielsweise 3 verschiedene Spalten abgeglichen haben und bestimmte Spalten stärker gewichten möchten:
SELECT search.*, MATCH (name) AGAINST ('black' IN BOOLEAN MODE) AS name_match, MATCH (keywords) AGAINST ('black' IN BOOLEAN MODE) AS keyword_match, MATCH (description) AGAINST ('black' IN BOOLEAN MODE) AS description_match FROM search WHERE MATCH (name, keywords, description) AGAINST ('black' IN BOOLEAN MODE) ORDER BY (name_match * 3 + keyword_match * 2 + description_match) DESC LIMIT 0,100;
quelle
SELECT search.*, (MATCH (name) AGAINST ('black' IN BOOLEAN MODE) * 3) + (MATCH (keywords) AGAINST ('black' IN BOOLEAN MODE)*2 + MATCH (description) AGAINST ('black' IN BOOLEAN MODE)) AS totalScore , FROM search WHERE MATCH (name, keywords, description) AGAINST ('black' IN BOOLEAN MODE) ORDER BY totalScore DESC LIMIT 0,100;