MySQL match() contre() - tri par pertinence et de la colonne?

Ok, donc j'essaie de faire une recherche plein texte dans 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?) ce que j'ai pu 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

Voici maintenant la partie où je me perds, je veux prioriser la pertinence dans la colonne head .

je suppose que je pourrais faire deux colonnes de pertinence, une pour head et une pour body , mais à ce moment-là je ferais un peu la même recherche dans la table trois fois, et pour ce que je fais cette fonction, la performance est importante, puisque la requête sera à la fois joint et apparié avec d'autres tables.

alors, ma question principale est , y a-t-il un moyen plus rapide de rechercher la pertinence et de prioriser certaines colonnes? (Et comme bonus peut-être même faire compter la pertinence nombre de fois le des mots apparaissent dans les colonnes?)

n'importe quelles suggestions ou conseils seraient grands.

Note: je vais lancer ceci sur un LAMP-server. (WAMP en local de test)

65
demandé sur Kristoffer la Cour 2011-06-07 04:56:01

4 réponses

Ce pourrait donner de l'importance croissante de la partie de la tête que vous voulez. Il ne doublera pas, mais il pourrait peut-être assez bon pour votre bien:

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

une alternative que vous voulez également étudier, si vous avez la flexibilité de changer de moteur DB, est Postgres . Il permet de définir le poids des opérateurs et de jouer avec le classement.

133
répondu Denis de Bernardy 2011-06-10 10:29:05

Je ne l'ai jamais fait, mais il semble que

MATCH (head, head, body) AGAINST ('some words' IN BOOLEAN MODE)

Devrait donner un double de poids pour les correspondances trouvées dans la tête.


il suffit de lire ce commentaire sur le docs page , pensé qu'il pourrait être d'une valeur pour vous:

publié par Patrick O'Lone le 9 décembre 2002 6: 51am

il doit être noté dans le documentation que dans le MODE booléen retournera presque toujours une pertinence de 1.0. Afin d'obtenir une pertinence qui est significatif, vous aurez besoin de:

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 

notez que vous êtes faire une recherche de pertinence régulière pour obtenir des facteurs de pertinence combiné avec une clause WHERE qui utilise le MODE booléen. Le MODE booléen vous donne le sous-ensemble qui répond aux exigences de la Recherche booléenne, la recherche de pertinence remplit les le facteur de pertinence, et La clause (dans ce cas) garantit que le document est pertinent pour recherche (c.-à-d. les documents qui obtiennent moins de points que de 0,2 sont considérés comme non pertinents). Cela vous permet également de commander par pertinence.



Cela peut ou peut ne pas être un insecte dans la façon dont Le MODE booléen fonctionne, bien que le commentaires que j'ai lus sur la liste de diffusion suggérez que dans le MODE booléen la pertinence du classement n'est pas très compliqué, ainsi, le prêt lui-même mal pour fournir réellement pertinent document. BTW, je ne l'ai pas remarqué une perte de performance pour faire ceci, puisque il semble que MySQL n'exécute que Recherche FULLTEXT une fois, même si le deux clauses de MATCH sont différentes. Utiliser Expliquez pour le prouver.

ainsi, il semblerait que vous ne devez pas vous soucier d'appeler la recherche fulltext deux fois, bien que vous devriez toujours "utiliser expliquer pour prouver ce"

9
répondu jisaacstone 2011-06-07 01:33:34

j'ajoute juste pour qui pourrait avoir besoin.. N'oubliez pas de modifier la table!

ALTER TABLE table_name ADD FULLTEXT(column_name);
9
répondu Camilla 2016-04-04 05:37:21

j'étais juste en train de jouer avec ça, aussi. Une façon que vous pouvez ajouter le poids supplémentaire est dans l'ordre par la zone du code.

par exemple, si vous concordez avec 3 colonnes différentes et que vous voulez pondérer plus lourdement certaines colonnes:

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;
3
répondu Noah King 2013-02-19 03:33:41