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