Às vezes, ao pesquisar em um banco de dados MySQL, você pode querer executar consultas de pesquisa de texto completo em dados baseados em caracteres. Hoje estamos discutindo as vantagens e desvantagens de tais métodos de busca.
O que são pesquisas de texto completo no MySQL?
A pesquisa de texto completo é uma técnica que permite pesquisar registros que podem não corresponder perfeitamente aos critérios de pesquisa. As pesquisas de texto completo no MySQL são executadas quando determinados índices estão em uso e esses índices têm muitas nuances exclusivas, incluindo o seguinte:
- Para que o índice seja considerado um índice de texto completo, o índice deve ser do tipo FULLTEXT.
- Os índices FULLTEXT só podem ser usados em tabelas que executam os mecanismos de armazenamento InnoDB ou MyISAM.
- Índices FULLTEXT só podem ser criados para colunas CHAR, VARCHAR ou TEXT.
- Os índices FULLTEXT são usados apenas quando a cláusula MATCH() AGAINST() é usada.
- As pesquisas de texto completo têm três modos:o modo de linguagem natural, o modo booleano e o modo de expansão de consulta.
Um índice FULLTEXT é um tipo especial de índice que encontra palavras-chave no texto em vez de comparar os valores com os valores no índice. Embora a pesquisa FULLTEXT seja diferente de outros tipos de correspondência, observe que você pode ter um índice BTREE e um índice FULLTEXT na mesma coluna ao mesmo tempo - eles não entrarão em conflito porque são adequados para propósitos diferentes.
Tipos de pesquisa de texto completo
Ao executar pesquisas de texto completo no MySQL, lembre-se de que existem três tipos de pesquisa para escolher:
- Um tipo de pesquisa em linguagem natural - esse modo de pesquisa interpreta a string de pesquisa como uma frase literal. Ativado por padrão se nenhum modificador for especificado ou quando o modificador IN NATURAL LANGUAGE MODE for especificado;
- Um tipo de pesquisa de expansão de consulta - esse modo de pesquisa realiza a pesquisa duas vezes. Ao pesquisar pela segunda vez, o conjunto de resultados inclui alguns documentos mais relevantes da primeira pesquisa. Ativado usando o modificador WITH QUERY EXPANSION;
- Um tipo de pesquisa booleana - esse modo de pesquisa permite pesquisar consultas complexas que podem incluir operadores booleanos, como operadores menos que (“<”) e mais que (“>”), subexpressões (“( ” e “)”)), o sinal de mais (+), o sinal de menos (-), aspas (“”), um operador que diminui a contribuição do valor para os resultados (~) e o operador curinga (*) - o O operador curinga permite pesquisar com correspondência difusa (por exemplo, “demo*” também corresponderia a “demonstração”). Ativado usando o modificador IN BOOLEAN MODE.
Pesquisas de texto completo com o modo de pesquisa de linguagem natural
Um modo de pesquisa em linguagem natural, conforme observado acima, é ativado por padrão ou quando o modificador IN NATURAL LANGUAGE MODE é especificado. Este modo realiza uma pesquisa de linguagem natural em uma determinada coleção de texto (uma ou mais colunas). O formato básico de consulta de pesquisas de texto completo no MySQL deve ser semelhante ao seguinte:
SELECT * FROM table WHERE MATCH(column) AGAINST(“string” IN NATURAL LANGUAGE MODE);
Quando MATCH() é usado junto com uma cláusula WHERE, as linhas são automaticamente classificadas primeiro pela relevância mais alta. Para pesquisar uma string exata, coloque-a entre aspas duplas.
Pesquisas de texto completo com o modo de expansão de consulta
As pesquisas de texto completo também suportam o modo de expansão de consulta. Esse modo de pesquisa é frequentemente usado quando o usuário confia no conhecimento implícito - por exemplo, o usuário pode pesquisar "DBMS" esperando ver "MongoDB" e "MySQL" nos resultados da pesquisa. A razão pela qual o usuário pode confiar em algum conhecimento implícito ao usar esse modo de pesquisa é bastante simples - uma pesquisa de texto completo com o modo de expansão de consulta funciona realizando a pesquisa duas vezes:a segunda frase de pesquisa é a primeira frase de pesquisa concatenado com algumas entradas mais relevantes da primeira pesquisa. Isso significa que, por exemplo, se na primeira busca uma das linhas contivesse a palavra “DBMS” e a palavra “MySQL”, a segunda busca encontraria as entradas que incluíssem a palavra “MySQL” mesmo que não conter “SGBD”. O formato de consulta que usaria o modo de expansão de consulta ficaria assim:
SELECT * FROM table WHERE MATCH(column) AGAINST(“string” WITH QUERY EXPANSION);
Pesquisas de texto completo usando o modo booleano
O modo booleano é talvez uma das coisas mais interessantes que a pesquisa de texto completo do MySQL tem a oferecer. Esse modo tem muitas ressalvas exclusivas porque permite expandir os recursos de pesquisa usando operadores booleanos. Quando o modo booleano está em uso, certos caracteres podem ter um significado especial no início ou no final das palavras. Por exemplo:
- “+” significa E;
- “-” significa NÃO;
- Os operadores “(“ e “)” permitem criar subexpressões; Os operadores
- “<” e “>” alteram a classificação do valor de pesquisa para baixo ou superior;
- “~” reduz a contribuição do valor para os resultados da pesquisa;
- Aspas duplas (“”) correspondem apenas a valores literais;
- “*” é um operador curinga (consulte a explicação acima).
Esses operadores permitem expandir a funcionalidade da pesquisa:por exemplo, se você deseja recuperar todas as linhas que contêm a palavra “Demo”, mas não “Demo2”, você pode usar uma consulta igual a:
SELECT * FROM table WHERE MATCH(column) AGAINST (“+Demo -Demo2” IN BOOLEAN MODE);
Você também pode usar aspas duplas junto com aspas simples assim:
SELECT * FROM table WHERE MATCH(column) AGAINST(‘“search string”’ IN BOOLEAN MODE);
Sugestões de pesquisa de texto completo
Antes de usar a pesquisa de texto completo no MySQL, tenha em mente que a pesquisa tem algumas “pegadinhas”:
- Os mecanismos de armazenamento InnoDB e MyISAM têm suas próprias listas de palavras irrelevantes. A lista de palavras irrelevantes do InnoDB pode ser encontrada aqui, a lista de palavras irrelevantes MyISAM pode ser encontrada aqui.
- Para definir sua própria lista de palavras irrelevantes para o InnoDB, defina uma tabela com a mesma estrutura da tabela INNODB_FT_DEFAULT_STOPWORD, insira as palavras irrelevantes nela e defina o valor da opção innodb_ft_server_stopword_table na forma de db_name/table_name.
- Para definir sua própria lista de palavras irrelevantes para MyISAM, defina a variável ft_stopword_file para o nome do caminho do arquivo que contém a lista de palavras irrelevantes. No arquivo, as palavras irrelevantes podem ser separadas por qualquer caractere não alfanumérico, exceto “_” e “‘“. O arquivo de palavras irrelevantes padrão está localizado em storage/myisam/ft_static.c. As palavras irrelevantes podem ser desativadas definindo a variável como uma string vazia.
- As pesquisas de texto completo não são suportadas em tabelas particionadas.
- Todas as colunas em um índice FULLTEXT devem usar o mesmo conjunto de caracteres e ordenação.
- As operações de pesquisa de texto completo não tratam a string % como um curinga.
Aqui está outro problema:você também pode querer ter em mente que o analisador FULLTEXT integrado determina onde as palavras começam e terminam observando determinados caracteres, incluindo o espaço (“ “), vírgula (“, ”) e ponto (“.”), o que significa que, se sua string de pesquisa contiver um ou mais desses caracteres, os resultados da pesquisa podem não ser precisos. Por exemplo, se seu banco de dados contém 5 linhas com a string “test.demo”, a consulta de pesquisa “test.demo” pode retornar mais (10, 15 etc.) resultados, incluindo “demo”, “string.demo_example” etc. ele vai procurar por “demo” em vez de “test.demo”, então você pode ficar preso a muitas correspondências irrelevantes. O MySQL oferece uma solução alternativa para esse problema se você estiver disposto a escrever seu próprio plugin em C ou C++ (consulte a documentação do MySQL), mas até então, você não pode fazer muito.
A lista completa das restrições de texto completo do MySQL pode ser vista na página de documentação do MySQL.
Resumo
O recurso de pesquisa de texto completo do MySQL fornece uma maneira simples de implementar várias técnicas de pesquisa (pesquisa de linguagem natural, pesquisa de expansão de consulta e pesquisa booleana) em seu aplicativo que executa o MySQL. Cada uma dessas técnicas de pesquisa tem suas próprias ressalvas e cada uma delas pode ser adequada para diferentes propósitos - ao decidir usar a pesquisa de texto completo, lembre-se de que esse tipo de pesquisa tem muitas sutilezas exclusivas, conheça os benefícios e desvantagens de utilizar a pesquisa de texto completo no MySQL e escolha sabiamente.