MariaDB
 sql >> Datenbank >  >> RDS >> MariaDB

Wie MATCH AGAINST in MariaDB funktioniert

In MariaDB MATCH AGAINST ist ein spezielles Konstrukt, das verwendet wird, um eine Volltextsuche in einem Volltextindex durchzuführen.

Syntax

Die Syntax lautet wie folgt:

MATCH (col1,col2,...) AGAINST (expr [search_modifier])

Beispiel

Angenommen, wir haben eine Tabelle namens Products das beinhaltet die folgenden Daten:

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

Diese Tabelle hat einen Volltextindex für ihre ProductDescription Säule. Das bedeutet, dass wir MATCH AGAINST verwenden können um eine Volltextsuche in dieser Spalte durchzuführen.

Beispiel:

SELECT 
    ProductId AS "Id",
    ProductName,
    ProductDescription
FROM Products 
WHERE MATCH(ProductDescription) AGAINST('includes')
ORDER BY ProductId ASC;

Ergebnis:

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

Erhalte die Punktzahl

Wir können MATCH AGAINST einfügen im SELECT Liste, um den Relevanzwert des Schlüsselworts innerhalb der durchsuchten Spalte/n zurückzugeben:

SELECT 
    ProductDescription,
    MATCH(ProductDescription) AGAINST ('includes') AS Score
FROM Products 
WHERE MATCH(ProductDescription) AGAINST ('includes')
ORDER BY Score DESC;

Ergebnis:

+-----------------------------------------+---------------------+
| ProductDescription                      | Score               |
+-----------------------------------------+---------------------+
| Orange. Includes spare fingers.         |  0.4883610010147095 |
| Blue. Includes right handed carry box.  |  0.4883610010147095 |
| Purple. Includes left handed carry box. | 0.48305025696754456 |
+-----------------------------------------+---------------------+

In diesem Fall haben wir auch einen ORDER BY verwendet Klausel zum Sortieren nach Punktzahl in absteigender Reihenfolge (d. h. die relevanteste zuerst).

Spalten ohne Volltextindex

Das vorherige Beispiel hat funktioniert, weil ich zuvor einen Volltextindex für die ProductDescription erstellt hatte Säule. Wenn ich das nicht getan hätte, hätte ich eine Fehlermeldung erhalten.

Folgendes passiert, wenn wir versuchen, MATCH AGAINST zu verwenden gegen eine Spalte, die keinen Volltextindex hat:

SELECT 
    ProductId,
    ProductName,
    ProductPrice
FROM Products 
WHERE MATCH(ProductName) AGAINST('screwdriver')
ORDER BY ProductId ASC;

Ergebnis:

ERROR 1191 (HY000): Can't find FULLTEXT index matching the column list

Lassen Sie uns einen Volltextindex für ProductName hinzufügen Spalte:

ALTER TABLE Products
ADD FULLTEXT(ProductName);

Führen Sie nun die Abfrage erneut aus:

SELECT 
    ProductId,
    ProductName,
    ProductPrice
FROM Products 
WHERE MATCH(ProductName) AGAINST('screwdriver')
ORDER BY ProductId ASC;

Ergebnis:

+-----------+--------------------------+--------------+
| ProductId | ProductName              | ProductPrice |
+-----------+--------------------------+--------------+
|         1 | Left handed screwdriver  |        25.99 |
|         2 | Right handed screwdriver |        25.99 |
+-----------+--------------------------+--------------+

Diesmal hat es geklappt.

Volltextindex in mehreren Spalten

Wir können Volltextindizes für mehrere Spalten hinzufügen.

Beispiel:

ALTER TABLE Products
ADD FULLTEXT(ProductName, ProductDescription);

Jetzt können wir MATCH AGAINST ausführen gegen diesen Volltextindex.

SELECT 
    ProductId AS Id, 
    ProductName, 
    ProductDescription
FROM Products 
WHERE MATCH(ProductName, ProductDescription) AGAINST ('weight')
OR MATCH(ProductName, ProductDescription) AGAINST ('ceramic')
ORDER BY Id ASC;

Ergebnis:

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