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