Como pesquisar uma frase como MySQL usando Full-Text


Nesse artigo será apresentado como pesquisar uma frase no banco de dados usando o Full-Text do MySQL com PHP.

Também será apresentado como usar o MATCH e o AGAINST do MySQL.

O que é Full-Text do MySQL?Full-Text permite que os usuários executem consultas de texto completo em dados baseados em palavras da frase. O Full-Text é utilizado para criar o índice de uma ou mais colunas. As tabelas podem ser InnoDB ou MyISAM. Os índices de texto completo devem ser criados apenas das colunas com tipo VARCHAR, CHAR ou TEXT.

Para o exemplo, primeiro vamos criar a tabela no banco de dados, usando o FULLTEXT como chave para criar um índice da coluna "nome".

CREATE TABLE IF NOT EXISTS `produtos` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nome` varchar(220) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`),
  FULLTEXT KEY `nome` (`nome`)
) ENGINE=MyISAM AUTO_INCREMENT=17 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Em seguida preencher o banco de dados os seguintes valores.

INSERT INTO `produtos` (`id`, `nome`) VALUES
(1, 'carro usado'),
(2, 'usado carro'),
(3, 'carro'),
(4, 'usado moto'),
(5, 'moto usado'),
(6, 'usado caminhao'),
(7, 'usado caminhão'),
(10, 'Caminhão usado 2010'),
(11, 'Usado Caminhão 2015'),
(13, 'caminhao usado 2014'),
(14, 'Carro usado 2016'),
(15, 'Carro usado 2017'),
(16, 'Carro seminovo');

Com o banco de dados criado, vamos ver como criar a QUERY usando MATCH e o AGAINST.

SELECT * FROM nome_da_tabela WHERE MATCH(coluna) AGAINST ('valor_ser_pesquisado')

Utilizando o exemplo acima, para pesquisar na tabela "produtos" criado anteriormente e utilizando a coluna "nome", a QUERY será:

SELECT * FROM produtos WHERE MATCH(nome) AGAINST ('caminhao usado')

Para ver o exemplo funcionando, criado o arquivo "index.php" e colocado o código abaixo, que possui o formulário para pesquisar, também possui a implementação do pesquisar. O código abaixo possui os comentários das principais funcionalidades.

<!DOCTYPE html>
<html lang="pt-br">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Pesquisar frase</title>
</head>
<body>
    <h1>Pesquisar</h1>
    <!-- Criar o formulário pesquisar -->
    <form method="POST" action="">
        <label>Frase a ser pesquisada: </label>

        <!-- Campo pesquisar -->
        <input name="pesquisar" type="text" placeholder="Frase a ser pesquisada" value="caminhao usado" require><br>      
          
        <small>No campo acima está definido para pesquisar por "caminhao usado". Para retirar o valor fixo somente apaga value="caminhao usado"</small><br><br>

        <!-- Botão para submeter o formulári pesquisar -->
        <input type="submit" value="Pesquisar" name="SendPesq"><br><hr>
    </form>

    <?php
    //Receber os dados do formulário
    $Dados = filter_input_array(INPUT_POST, FILTER_DEFAULT);
    //Verificar o botão possui valor, possuindo valor acessa o IF para pesquisar
    if (!empty($Dados['SendPesq'])) {
        //Criar a conexão com o banco de dados, sem usar a porta
        $conn = mysqli_connect("localhost", "usuario_bd", "senha_bd", "nome_bd");

        //Quando é necessário atribuir a porta do banco de dados na conexão necessário utilizar a conexão abaixo
        //A conexão abaixo será comentada, quando necessário utilizar a porta retirar o comentário da conexão abaixo e comentar a conexão acima sem a porta
        //$conn = mysqli_connect("localhost:3308", "usuario_bd", "senha_bd", "nome_bd");

        //Exemplo de conexão com as credencias padrão do servidor WampServer
        //$conn = mysqli_connect("localhost:3308", "root", "", "celke");

        //Recuperar do array o valor a ser pesquisado
        $pesquisar = $Dados['pesquisar'];

        //Imprimir a frase que vai ser pesquisada
        echo "Frase pesquisada: " . $pesquisar . "<br><hr>";

        //Criar a QUERY para realizar a pesquisa
        $query_pesq = "SELECT * FROM produtos WHERE MATCH(nome) AGAINST ('$pesquisar') LIMIT 10";
        //$query_pesq = "SELECT * FROM produtos WHERE MATCH(nome) AGAINST ('$pesquisar' IN NATURAL LANGUAGE MODE)";
        //Executar a QUERY 
        $resultado_pesq = mysqli_query($conn, $query_pesq);

        //Ler o resultado pesquisado        
        while($row_pesq = mysqli_fetch_assoc($resultado_pesq)){
            echo "ID: " . $row_pesq['id'] . "<br>";
            echo "Nome: " . $row_pesq['nome'] . "<br><hr>";
        }
    }
    ?>
</body>
</html>

Para baixar o backup do banco de dados e o exemplo do arquivo "index.php", pode ser baixado através do link: Como pesquisar como MySQL uma frase usando Full-Text do SQL

Portanto, chegamos ao final de mais um artigo, no mesmo foi abordado como usar o Full-Text do MySQL para pesquisar frases com MySQL.