MariaDB
 sql >> база данни >  >> RDS >> MariaDB

Как работи МАЧ СРЕЩУ в MariaDB

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Архивиране на база данни - Сравняване на MariaDB Mariabackup и Percona Xtrabackup

  2. Как работи UTC_TIMESTAMP() в MariaDB

  3. Защитната стена на SQL става лесна с ClusterControl и ProxySQL

  4. Как работи COMPRESS() в MariaDB

  5. Как да надстроите MariaDB 5.5 до MariaDB 10.1 на CentOS/RHEL 7 и Debian системи