Recherche en texte intégral MySQL : optimisation de la pertinence et de la priorisation des colonnes
Lorsque vous effectuez des recherches en texte intégral sur plusieurs colonnes de tableau, il est souvent souhaitable de trier les résultats par pertinence. La fonction MATCH() AGAINST() de MySQL fournit un moyen efficace d'y parvenir.
Cependant, il arrive parfois qu'il soit crucial de donner la priorité à la pertinence dans des colonnes spécifiques. Supposons, par exemple, que nous ayons un tableau contenant des pages avec des colonnes d'en-tête et de corps, dans lesquelles nous souhaitons accorder une priorité plus élevée aux correspondances trouvées dans la colonne d'en-tête.
Solution : intégrer la pertinence spécifique aux colonnes
Pour répondre à cette exigence, nous pouvons exploiter une clause MATCH() supplémentaire pour calculer la pertinence séparément pour la colonne d'en-tête. En combinant cela avec la pertinence globale, nous pouvons hiérarchiser les résultats qui correspondent à la fois aux critères de recherche globaux et à la colonne spécifiée.
SELECT pages.*, MATCH(head, body) AGAINST('some words') AS relevance, MATCH(head) AGAINST('some words') AS head_relevance FROM pages WHERE MATCH(head, body) AGAINST('some words') ORDER BY head_relevance DESC, relevance DESC
Dans cette requête, nous calculons à la fois la pertinence globale (pertinence) et la colonne de tête. pertinence spécifique (head_relevance). En classant les résultats d'abord par head_relevance dans l'ordre décroissant (DESC), puis par pertinence également dans l'ordre décroissant, nous hiérarchisons efficacement les correspondances trouvées dans la colonne d'en-tête.
Bonus : comptage des occurrences des termes de recherche
Bien que l'approche ci-dessus améliore la hiérarchisation des colonnes, elle ne fournit pas de décompte des occurrences des termes de recherche dans la plage spécifiée. colonnes. Pour y parvenir, nous pouvons utiliser les fonctions FULLTEXT() et LENGTH() :
... SELECT pages.*, MATCH(head, body) AGAINST('some words') AS relevance, MATCH(head) AGAINST('some words') AS head_relevance, LENGTH(head) - LENGTH(REPLACE(head, 'some words', '')) AS head_count, LENGTH(body) - LENGTH(REPLACE(body, 'some words', '')) AS body_count FROM pages ...
Cela étend la requête précédente pour calculer le nombre d'occurrences de termes de recherche dans la tête (head_count) et le corps (body_count) colonnes.
Options supplémentaires : Postgres et pondération
Si cela convient à votre projet, Postgres propose des fonctionnalités avancées qui permettent un contrôle plus fin du classement par pertinence. Ses capacités de recherche prennent en charge la pondération de termes ou d'opérateurs spécifiques, permettant une plus grande personnalisation des résultats de recherche.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!