MariaDB
 sql >> Base de Dados >  >> RDS >> MariaDB

Como o MATCH AGAINST funciona no MariaDB


No MariaDB, MATCH AGAINST é uma construção especial usada para realizar uma pesquisa de texto completo em um índice de texto completo.

Sintaxe


A sintaxe fica assim:
MATCH (col1,col2,...) AGAINST (expr [search_modifier])

Exemplo


Suponha que tenhamos uma tabela chamada Products que inclui os seguintes dados:
+----+---------------------------------+-----------------------------------------+
| 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.        |
+----+---------------------------------+-----------------------------------------+

Esta tabela tem um índice de texto completo em seu ProductDescription coluna. Isso significa que podemos usar MATCH AGAINST para fazer uma pesquisa de texto completo nessa coluna.

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

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

Conheça a pontuação


Podemos incluir MATCH AGAINST no SELECT list para retornar a pontuação de relevância da palavra-chave na(s) coluna(s) pesquisada(s):
SELECT 
    ProductDescription,
    MATCH(ProductDescription) AGAINST ('includes') AS Score
FROM Products 
WHERE MATCH(ProductDescription) AGAINST ('includes')
ORDER BY Score DESC;

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

Neste caso também usamos um ORDER BY cláusula para classificar pela pontuação em ordem decrescente (ou seja, mais relevante primeiro).

Colunas sem índice de texto completo


O motivo pelo qual o exemplo anterior funcionou é porque eu criei anteriormente um índice de texto completo no ProductDescription coluna. Se eu não tivesse feito isso, teria recebido um erro.

Veja o que acontece quando tentamos usar MATCH AGAINST em uma coluna que não possui um índice de texto completo:
SELECT 
    ProductId,
    ProductName,
    ProductPrice
FROM Products 
WHERE MATCH(ProductName) AGAINST('screwdriver')
ORDER BY ProductId ASC;

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

Vamos adicionar um índice de texto completo no ProductName coluna:
ALTER TABLE Products
ADD FULLTEXT(ProductName);

Agora execute a consulta novamente:
SELECT 
    ProductId,
    ProductName,
    ProductPrice
FROM Products 
WHERE MATCH(ProductName) AGAINST('screwdriver')
ORDER BY ProductId ASC;

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

Desta vez funcionou.

Índice de texto completo em várias colunas


Podemos adicionar índices de texto completo em várias colunas.

Exemplo:
ALTER TABLE Products
ADD FULLTEXT(ProductName, ProductDescription);

Agora podemos executar MATCH AGAINST contra esse índice de texto completo.
SELECT 
    ProductId AS Id, 
    ProductName, 
    ProductDescription
FROM Products 
WHERE MATCH(ProductName, ProductDescription) AGAINST ('weight')
OR MATCH(ProductName, ProductDescription) AGAINST ('ceramic')
ORDER BY Id ASC;

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