O que é Pesquisa de texto completo vs LIKE

133

Acabei de ler um post mencionando "pesquisa de texto completo" no SQL.

Eu só queria saber qual é a diferença entre STF e LIKE. Eu li alguns artigos, mas não consegui encontrar nada que explicasse bem.

Nathan W
fonte

Respostas:

164

Em geral, há uma troca entre "precisão" e "recall". Alta precisão significa que menos resultados irrelevantes são apresentados (sem falsos positivos), enquanto alta recordação significa que menos resultados relevantes estão faltando (sem falsos negativos). O uso do operador LIKE fornece 100% de precisão, sem concessões para recall. Um recurso de pesquisa de texto completo oferece muita flexibilidade para ajustar a precisão para melhor recuperação.

A maioria das implementações de pesquisa de texto completo usa um "índice invertido". Este é um índice em que as chaves são termos individuais e os valores associados são conjuntos de registros que contêm o termo. A pesquisa de texto completo é otimizada para calcular a interseção, união, etc. desses conjuntos de registros e geralmente fornece um algoritmo de classificação para quantificar a força com que um determinado registro corresponde às palavras-chave da pesquisa.

O operador SQL LIKE pode ser extremamente ineficiente. Se você aplicá-lo a uma coluna não indexada, uma varredura completa será usada para encontrar correspondências (como qualquer consulta em um campo não indexado). Se a coluna estiver indexada, a correspondência poderá ser realizada com relação às chaves de índice, mas com muito menos eficiência do que a maioria das pesquisas de índice. Na pior das hipóteses, o padrão LIKE terá curingas principais que exigem que todas as chaves de índice sejam examinadas. Por outro lado, muitos sistemas de recuperação de informações podem habilitar o suporte para caracteres curingas líderes, pré-compilando árvores de sufixos em campos selecionados.

Outros recursos típicos da pesquisa de texto completo são

  • análise ou tokenização lexical - dividindo um bloco de texto não estruturado em palavras, frases e tokens especiais
  • análise morfológica ou derivada - variações do colapso de uma determinada palavra em um termo do índice; por exemplo, tratando "ratos" e "mouse" ou "eletrificação" e "elétrico" com a mesma palavra
  • classificação - medindo a semelhança de um registro correspondente à string de consulta
erickson
fonte
2
o ranking é melhor explicado em @ de VipinJain resposta
ychaouche
39

O STF envolve a indexação de palavras individuais em um campo de texto para agilizar a pesquisa em muitos registros. O uso de LIKE ainda exige que você faça uma pesquisa de sequência (linear ou similar) dentro do campo.

Ignacio Vazquez-Abrams
fonte
23

O MySQL cria um índice a partir das palavras da coluna de pesquisa de texto completo ativada e realiza pesquisas nesse índice. O MySQL usa um algoritmo sofisticado para determinar as linhas correspondentes à consulta de pesquisa.

Além disso, a partir desta resposta SO :

Existem algumas vantagens na pesquisa de texto completo.

Indexação:

Algo como:

WHERE Foo LIKE '%Bar';

Não é possível tirar proveito de um índice. Ele precisa olhar para cada linha e ver se corresponde. Um índice de texto completo, no entanto, pode. De fato, os índices de texto completo podem oferecer muito mais flexibilidade em termos da ordem das palavras correspondentes, da proximidade dessas palavras etc.

Stemming:

Uma pesquisa de texto completo pode conter palavras. Se você pesquisar por execução, poderá obter resultados para "executado" ou "executando". A maioria dos mecanismos de texto completo possui dicionários-tronco em vários idiomas.

Resultados ponderados:

Um índice de texto completo pode abranger várias colunas. Por exemplo, você pode procurar por "torta de pêssego" e o índice pode incluir um título, palavras-chave e um corpo. Os resultados que correspondem ao título podem ser ponderados mais alto, conforme mais relevantes, e podem ser classificados para serem exibidos próximo ao topo.

Desvantagens:

Um índice de texto completo pode ser potencialmente enorme, muitas vezes maior que um índice B-TREE padrão. Por esse motivo, muitos provedores hospedados que oferecem instâncias de banco de dados desabilitam esse recurso ou, pelo menos, cobram mais por isso. Por exemplo, a última vez que verifiquei, o Windows Azure não suportava consultas de texto completo.

Os índices de texto completo também podem ser mais lentos para atualizar. Se os dados mudarem muito, pode haver algum atraso na atualização dos índices em comparação aos índices padrão.

Vipin Jain
fonte
16

O Like usa apenas curingas e não é tão poderoso.

O texto completo permite uma pesquisa muito mais complexa, incluindo E, Ou, Não, até resultados de som semelhantes (SOUNDEX) e muitos outros itens.

Gostaria de começar a examinar os itens SQL CONTAINS () FREETEXT () e de pesquisa de texto completo relacionados para ajudar a entender melhor o que está disponível.

Mitchel Sellers
fonte
2
Eu recomendo a todos verificação SOUNDEX
SOTN
11

A diferença real são as metodologias de varredura. Para pesquisa em texto completo, as palavras (termos) são usadas como chaves de hash - cada uma delas associada a uma matriz de documentos nas quais as chaves (termos) aparecem. É assim:

Document sets = {d1, d2, d3, d4, ... dn}
Term sets = {t1, t2, t3, .. tn}

Agora, a matriz termo-documento (qual membro do termo de qual documento) pode ser representada como:

t1 -> {d1, d5, d9,.. dn}
t2 -> {d11, d50, d2,.. dn}
t3 -> {d23, d67, d34,.. dn}
:
tn -> {d90, d87, d57,.. dn}

Quando chega a solicitação, solicitando "Obter todos os documentos que contenham a palavra / termo t1" - o conjunto de documentos {d1, d5, d9,.. dn} é retornado.

Você pode invadir um esquema de tabela não normalizada para armazenar documentos - cada linha da tabela MySQL será considerada como "documento" e uma coluna TEXT poderá conter um parágrafo etc. O índice invertido conterá os termos como chaves de hash e os IDs de linha como os IDs do documento.

Lembre-se de que esta consulta SQL terá mais ou menos desempenho O (1). A consulta será independente de

  1. Número de palavras / termos na coluna TEXTO
  2. O número de linhas / documentos que correspondem aos critérios
  3. O comprimento das palavras / termos

Por exemplo, esse SQL pode ser disparado para extrair todas as linhas correspondentes à palavra XYZ:

SELECT * 
FROM   my_table 
WHERE  MATCH (my_text_column) against ('XYZ' IN boolean mode) ;

Advertência: Se você adicionar ORDER BY a essa consulta, seus tempos de execução variarão com base nos vários parâmetros, um dos quais é o número de linhas / documentos correspondentes. Então cuidado.

O LIKE, no entanto, não tem nada disso. É forçado a digitalizar linearmente a frase / string e encontrar todos os termos correspondentes. Adicionar curinga adiciona à bagunça. Funciona muito bem para seqüências de caracteres pequenas, como você pode imaginar, mas falhará miseravelmente em frases mais longas. E definitivamente não é comparável quando se tem um parágrafo ou uma página inteira de texto, etc.

Kingz
fonte
3

O FTS é mais eficiente, poderoso (especialmente para Word Breakers e funcionalidades derivadas) ... mas verifique seus requisitos, porque às vezes os DBs não suportam todos os idiomas, por exemplo, o MSSQL não suporta o grego (verifique nesta página http: // msdn. microsoft.com/en-us/library/ms176076(v=sql.110).aspx )

kamskyleo
fonte