Dans MariaDB, MATCH AGAINST
est une construction spéciale utilisée pour effectuer une recherche de texte intégral sur un index de texte intégral.
Syntaxe
La syntaxe ressemble à ceci :
MATCH (col1,col2,...) AGAINST (expr [search_modifier])
Exemple
Supposons que nous ayons une table appelée Products
qui inclut les données suivantes :
+----+---------------------------------+-----------------------------------------+ | Id | ProductName | ProductDescription | +----+---------------------------------+-----------------------------------------+ | 1 | Left handed screwdriver | Purple. Includes left handed carry box. | | 2 | Right handed screwdriver | Blue. Includes right handed carry box. | | 3 | Long Weight (blue) | Approximate 45 minute waiting period. | | 4 | Long Weight (green) | Approximate 30 minute waiting period. | | 5 | Sledge Hammer | Wooden handle. Free wine glasses. | | 6 | Chainsaw | Orange. Includes spare fingers. | | 7 | Straw Dog Box | Tied with vines. Very chewable. | | 8 | Bottomless Coffee Mugs (4 Pack) | Brown ceramic with solid handle. | +----+---------------------------------+-----------------------------------------+
Cette table a un index de texte intégral sur son ProductDescription
colonne. Cela signifie que nous pouvons utiliser MATCH AGAINST
pour effectuer une recherche en texte intégral sur cette colonne.
Exemple :
SELECT
ProductId AS "Id",
ProductName,
ProductDescription
FROM Products
WHERE MATCH(ProductDescription) AGAINST('includes')
ORDER BY ProductId ASC;
Résultat :
+----+--------------------------+-----------------------------------------+ | Id | ProductName | ProductDescription | +----+--------------------------+-----------------------------------------+ | 1 | Left handed screwdriver | Purple. Includes left handed carry box. | | 2 | Right handed screwdriver | Blue. Includes right handed carry box. | | 6 | Chainsaw | Orange. Includes spare fingers. | +----+--------------------------+-----------------------------------------+
Obtenir le score
Nous pouvons inclure MATCH AGAINST
dans le SELECT
list afin de renvoyer le score de pertinence du mot-clé dans la ou les colonnes recherchées :
SELECT
ProductDescription,
MATCH(ProductDescription) AGAINST ('includes') AS Score
FROM Products
WHERE MATCH(ProductDescription) AGAINST ('includes')
ORDER BY Score DESC;
Résultat :
+-----------------------------------------+---------------------+ | ProductDescription | Score | +-----------------------------------------+---------------------+ | Orange. Includes spare fingers. | 0.4883610010147095 | | Blue. Includes right handed carry box. | 0.4883610010147095 | | Purple. Includes left handed carry box. | 0.48305025696754456 | +-----------------------------------------+---------------------+
Dans ce cas, nous avons également utilisé un ORDER BY
clause pour trier par score dans l'ordre décroissant (c'est-à-dire le plus pertinent en premier).
Colonnes sans index de texte intégral
La raison pour laquelle l'exemple précédent a fonctionné est que j'avais précédemment créé un index de texte intégral sur ProductDescription
colonne. Si je ne l'avais pas fait, j'aurais reçu une erreur.
Voici ce qui se passe lorsque nous essayons d'utiliser MATCH AGAINST
par rapport à une colonne qui n'a pas d'index de texte intégral :
SELECT
ProductId,
ProductName,
ProductPrice
FROM Products
WHERE MATCH(ProductName) AGAINST('screwdriver')
ORDER BY ProductId ASC;
Résultat :
ERROR 1191 (HY000): Can't find FULLTEXT index matching the column list
Ajoutons un index de texte intégral sur le ProductName
colonne :
ALTER TABLE Products
ADD FULLTEXT(ProductName);
Exécutez à nouveau la requête :
SELECT
ProductId,
ProductName,
ProductPrice
FROM Products
WHERE MATCH(ProductName) AGAINST('screwdriver')
ORDER BY ProductId ASC;
Résultat :
+-----------+--------------------------+--------------+ | ProductId | ProductName | ProductPrice | +-----------+--------------------------+--------------+ | 1 | Left handed screwdriver | 25.99 | | 2 | Right handed screwdriver | 25.99 | +-----------+--------------------------+--------------+
Cette fois, ça a marché.
Index de texte intégral sur plusieurs colonnes
Nous pouvons ajouter des index de texte intégral sur plusieurs colonnes.
Exemple :
ALTER TABLE Products
ADD FULLTEXT(ProductName, ProductDescription);
Maintenant, nous pouvons exécuter MATCH AGAINST
par rapport à cet index de texte intégral.
SELECT
ProductId AS Id,
ProductName,
ProductDescription
FROM Products
WHERE MATCH(ProductName, ProductDescription) AGAINST ('weight')
OR MATCH(ProductName, ProductDescription) AGAINST ('ceramic')
ORDER BY Id ASC;
Résultat :
+----+---------------------------------+---------------------------------------+ | Id | ProductName | ProductDescription | +----+---------------------------------+---------------------------------------+ | 3 | Long Weight (blue) | Approximate 45 minute waiting period. | | 4 | Long Weight (green) | Approximate 30 minute waiting period. | | 8 | Bottomless Coffee Mugs (4 Pack) | Brown ceramic with solid handle. | +----+---------------------------------+---------------------------------------+