MySQL match() contre() - tri par pertinence et de la colonne?
Ok, donc j'essaie de faire une recherche en plein texte en plusieurs colonnes, quelque chose de simple comme ceci:
SELECT * FROM pages WHERE MATCH(head, body) AGAINST('some words' IN BOOLEAN MODE)
Maintenant, je veux à l'ordre par pertinence, (combien de mots?) que j'ai été capable de le faire avec quelque chose comme ceci:
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
Maintenant, voici la partie où je me suis perdu, je veux prioriser la pertinence, dans le head
colonne.
Je suppose que je pourrais faire deux de la pertinence des colonnes, l'une pour head
et un pour body
, mais à ce point, je ferais un peu la même recherche dans la table trois fois, et pour ce que je suis en train de faire cette fonction, la performance est importante, puisque la requête à la fois être rejoint et comparés à d'autres tables.
Donc, ma question principale est de, est-il un moyen plus rapide pour la recherche de la pertinence et de donner la priorité à certaines colonnes? (Et en bonus, peut-être même faire la pertinence de compter le nombre de fois où les mots se produire dans les colonnes?)
Des suggestions ou des conseils seraient les grands.
Remarque: je vais être en cours d'exécution sur une LAMPE-serveur. (WAMP en local tests)
- Avez-vous vraiment besoin de mettre de MATCH...CONTRE à la fois la clause SELECT et dans la clause where? Ne pouvez-vous pas d'alias dans la clause SELECT et reportez-vous à l'alias dans la clause where? Je suis en train d'utiliser les requêtes préparées, ce qui semble redondant/étrange pour moi.
Vous devez vous connecter pour publier un commentaire.
Ce pourrait donner de l'importance croissante de la partie de la tête que vous voulez. Il ne sera pas le double, mais il pourrait, peut-être assez bon pour votre bien:
Une alternative que vous aussi, vous voulez étudier, si vous avez la flexibilité de l'interrupteur du moteur DB, est Postgres. Il permet de définir le poids des opérateurs et de jouer avec le classement.
MATCH
états, en raison de la façon MySQL fonctionne en interne.ALTER TABLE talk_webpages ADD FULLTEXT(head)
etALTER TABLE talk_webpages ADD FULLTEXT(head, body)
Juste ajouter pour qui en a besoin.. N'oubliez pas de modifier la table!
Je n'ai jamais fait, mais il semble que
Devrait donner un double de poids pour les correspondances trouvées dans la tête.
Viens de lire ce commentaire sur le docs page, Pensé qu'il pourrait être avantageux pour vous:
Il semblerait donc que vous ne pouvez pas besoin de s'inquiéter à propos de l'appel de la recherche fulltext deux fois, si vous devez encore "utiliser les EXPLIQUER, pour le prouver"
J'étais en train de jouer avec cela, aussi. Une façon vous pouvez ajouter de poids supplémentaire est de l'ORDRE PAR la zone du code.
Par exemple, si vous avez été correspondre à 3 colonnes différentes et je voulais plus lourdement le poids de certaines colonnes:
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;