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