MariaDB
 sql >> Baza danych >  >> RDS >> MariaDB

Jak działa funkcja DOPASUJ PRZECIW w MariaDB

W MariaDB, MATCH AGAINST to specjalna konstrukcja używana do wykonywania wyszukiwania pełnotekstowego w indeksie pełnotekstowym.

Składnia

Składnia wygląda tak:

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

Przykład

Załóżmy, że mamy tabelę o nazwie Products który zawiera następujące dane:

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

Ta tabela ma indeks pełnotekstowy w swoim ProductDescription kolumna. Oznacza to, że możemy użyć MATCH AGAINST aby przeprowadzić wyszukiwanie pełnotekstowe w tej kolumnie.

Przykład:

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

Wynik:

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

Zdobądź wynik

Możemy dołączyć MATCH AGAINST w SELECT listę w celu zwrócenia wyniku trafności słowa kluczowego w przeszukiwanej kolumnie (kolumnach):

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

Wynik:

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

W tym przypadku również użyliśmy ORDER BY klauzula sortowania według wyniku w kolejności malejącej (tj. najtrafniejsze jako pierwsze).

Kolumny bez indeksu pełnotekstowego

Powodem, dla którego poprzedni przykład działał, jest to, że wcześniej utworzyłem indeks pełnotekstowy w ProductDescription kolumna. Gdybym tego nie zrobił, otrzymałbym błąd.

Oto, co się dzieje, gdy próbujemy użyć MATCH AGAINST w stosunku do kolumny, która nie ma indeksu pełnotekstowego:

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

Wynik:

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

Dodajmy indeks pełnotekstowy do ProductName kolumna:

ALTER TABLE Products
ADD FULLTEXT(ProductName);

Teraz uruchom zapytanie ponownie:

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

Wynik:

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

Tym razem się udało.

Pełnotekstowy indeks w wielu kolumnach

Możemy dodać indeksy pełnotekstowe w wielu kolumnach.

Przykład:

ALTER TABLE Products
ADD FULLTEXT(ProductName, ProductDescription);

Teraz możemy uruchomić MATCH AGAINST w stosunku do tego indeksu pełnotekstowego.

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

Wynik:

+----+---------------------------------+---------------------------------------+
| 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. Szyfrowanie baz danych:dlaczego i gdzie potrzebne jest szyfrowanie danych

  2. Nasze najpopularniejsze posty na blogu o bazach danych w 2017 r.

  3. Jak WEEKDAY() działa w MariaDB

  4. 8 funkcji zwracających dzień z daty w MariaDB

  5. Funkcja MIN() w MariaDB