В MariaDB, MATCH AGAINST
е специална конструкция, използвана за извършване на пълнотекстово търсене в индекс на пълен текст.
Синтаксис
Синтаксисът е така:
MATCH (col1,col2,...) AGAINST (expr [search_modifier])
Пример
Да предположим, че имаме таблица, наречена Products
което включва следните данни:
+----+---------------------------------+-----------------------------------------+ | 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. | +----+---------------------------------+-----------------------------------------+
Тази таблица има индекс на пълен текст в своя ProductDescription
колона. Това означава, че можем да използваме MATCH AGAINST
за да извършите пълнотекстово търсене в тази колона.
Пример:
SELECT
ProductId AS "Id",
ProductName,
ProductDescription
FROM Products
WHERE MATCH(ProductDescription) AGAINST('includes')
ORDER BY ProductId ASC;
Резултат:
+----+--------------------------+-----------------------------------------+ | 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. | +----+--------------------------+-----------------------------------------+
Вземете резултата
Можем да включим MATCH AGAINST
в SELECT
списък, за да се върне оценката за уместност на ключовата дума в търсените колони/и:
SELECT
ProductDescription,
MATCH(ProductDescription) AGAINST ('includes') AS Score
FROM Products
WHERE MATCH(ProductDescription) AGAINST ('includes')
ORDER BY Score DESC;
Резултат:
+-----------------------------------------+---------------------+ | ProductDescription | Score | +-----------------------------------------+---------------------+ | Orange. Includes spare fingers. | 0.4883610010147095 | | Blue. Includes right handed carry box. | 0.4883610010147095 | | Purple. Includes left handed carry box. | 0.48305025696754456 | +-----------------------------------------+---------------------+
В този случай използвахме и ORDER BY
клауза за сортиране по резултата в низходящ ред (т.е. първо най-подходящото).
Колони без пълнотекстов индекс
Причината, поради която предишният пример работи, е, че преди това бях създал пълен текстов индекс в ProductDescription
колона. Ако не бях направил това, щях да получа грешка.
Ето какво се случва, когато се опитаме да използваме MATCH AGAINST
срещу колона, която няма индекс на пълен текст:
SELECT
ProductId,
ProductName,
ProductPrice
FROM Products
WHERE MATCH(ProductName) AGAINST('screwdriver')
ORDER BY ProductId ASC;
Резултат:
ERROR 1191 (HY000): Can't find FULLTEXT index matching the column list
Нека добавим индекс на пълен текст към ProductName
колона:
ALTER TABLE Products
ADD FULLTEXT(ProductName);
Сега стартирайте заявката отново:
SELECT
ProductId,
ProductName,
ProductPrice
FROM Products
WHERE MATCH(ProductName) AGAINST('screwdriver')
ORDER BY ProductId ASC;
Резултат:
+-----------+--------------------------+--------------+ | ProductId | ProductName | ProductPrice | +-----------+--------------------------+--------------+ | 1 | Left handed screwdriver | 25.99 | | 2 | Right handed screwdriver | 25.99 | +-----------+--------------------------+--------------+
Този път се получи.
Пълен текст индекс на множество колони
Можем да добавяме пълнотекстови индекси към множество колони.
Пример:
ALTER TABLE Products
ADD FULLTEXT(ProductName, ProductDescription);
Сега можем да стартираме MATCH AGAINST
спрямо този индекс на пълен текст.
SELECT
ProductId AS Id,
ProductName,
ProductDescription
FROM Products
WHERE MATCH(ProductName, ProductDescription) AGAINST ('weight')
OR MATCH(ProductName, ProductDescription) AGAINST ('ceramic')
ORDER BY Id ASC;
Резултат:
+----+---------------------------------+---------------------------------------+ | 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. | +----+---------------------------------+---------------------------------------+