MariaDB
 sql >> Base de données >  >> RDS >> MariaDB

Comment MATCH CONTRE fonctionne dans MariaDB

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.      |
+----+---------------------------------+---------------------------------------+