Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Pesquisas de texto completo no MySQL:o bom, o ruim e o feio

À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:

  1. 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;
  2. 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;
  3. 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.