mysql-search-fulltext

Use o FULLTEXT Index para buscar frases inteiras no MySQL

Você pode usar o FULLTEXT para encontrar, muito rápido, frases inteiras dentro de uma tabela no MySQL, dentro de um banco de dados consideravelmente volumoso.
O conceito de frase é um conjunto de palavras adjacentes dentro de uma ordem específica.
É possível, ainda, combinar o recurso com o casamento de padrões.
Exemplo de uso de SELECT COUNT FULLTEXT no MySQL
Para encontrar registros que contenham uma frase, em particular, não dá para usar uma consulta simples com FULLTEXT. No exemplo, que segue, vou pesquisar a tabela biblia, pela frase ‘deus de israel’, dentro do campo ‘textover’ — e o resultado não será o desejado (já aviso logo):

SELECT COUNT(*) FROM biblia
-> WHERE MATCH(textover) AGAINST('deus de israel');
+----------+
| COUNT(*) |
+----------+
|     5698 |
+----------+

1 row in set (0.02 sec)
Não há esta quantidade toda de ocorrências da string ‘deus de israel’ na bíblia.
Na verdade, este resultado reflete a quantidade de vezes em que estas palavras são encontradas no banco de dados. Ponha nesta conta também que a busca FULLTEXT computa um ranking de relevância baseado na presença de cada palavra individualmente, independente da quantidade de vezes em que ocorram dentro da coluna ‘textover’ e o ranking será não zero desde que uma das palavras esteja presente no campo pesquisado.
Consequentemente, este tipo de consulta tende a resultar em uma quantidade muito maior de registros.

O Rank — também conhecido como medida de relevância —, é um número dado pelo MySQL que determina a qualidade de um determinado resultado de uma pequisa.

Para obter um resultado realista, é necessário envolver a string a ser pesquisada entre aspas duplas, ao mesmo tempo em que se ativa o modo booleano de busca:

SELECT COUNT(*) FROM biblia
-> WHERE MATCH(vtext) AGAINST('"deus de israel"' IN BOOLEAN MODE);

E, assim, podemos chegar a um resultado crível. Veja:

+----------+
| COUNT(*) |
+----------+
|      197 |
+----------+
1 row in set (0.02 sec)

Veja um outro exemplo, com menos resultados.

SELECT COUNT(*) FROM biblia
-> WHERE WHERE MATCH(textover) AGAINST('"disse o profeta"' IN BOOLEAN MODE);
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+
1 row in set (0.00 sec)

Se quiser verificar in loco os resultados, use a seguinte consulta:

SELECT * FROM biblia 
-> WHERE MATCH(textover) AGAINST('"disse o profeta"' IN BOOLEAN MODE)\G;
*************************** 1. row ***************************
  numliv: 9
  numcap: 22
  numver: 5
textover: Disse o profeta Gade a Davi: Não fiques no lugar forte; sai, e entra na terra de Judá. Então Davi saiu, e foi para o bosque de Herete.
*************************** 2. row ***************************
  numliv: 24
  numcap: 28
  numver: 15
textover: Então disse o profeta Jeremias ao profeta Hananias: Ouve agora, Hananias: O Senhor não te enviou, mas tu fazes que este povo confie numa mentira.
*************************** 3. row ***************************
  numliv: 43
  numcap: 1
  numver: 23
textover: Respondeu ele: Eu sou a voz do que clama no deserto: Endireitai o caminho do Senhor, como disse o profeta Isaías.
3 rows in set (0.00 sec)

Obviamente, gosto mais do seguinte exemplo… 😉

SELECT * FROM biblia
-> WHERE MATCH(textover) AGAINST('"o profeta elias"' IN BOOLEAN MODE)\G;
*************************** 1. row ***************************
  numliv: 11
  numcap: 18
  numver: 36
textover: Sucedeu pois que, sendo já hora de se oferecer o sacrifício da tarde, o profeta Elias se chegou, e disse: Ó Senhor, Deus de Abraão, de Isaque, e de Israel, seja manifestado hoje que tu és Deus em Israel, e que eu sou teu servo, e que conforme a tua palavra tenho feito todas estas coisas.
*************************** 2. row ***************************
  numliv: 39
  numcap: 4
  numver: 5
textover: Eis que eu vos enviarei o profeta Elias, antes que venha o grande e terrível dia do Senhor;
2 rows in set (0.00 sec)

Publicado por

Elias Praciano

Autor de tecnologia (livre, de preferência), apaixonado por programação e astronomia. Fã de séries, como "Rick and Morty" e "BoJack Horseman". Me siga no Twitter e vamos trocar ideias!

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *