Pergunta

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

Eu só estava me perguntando qual é a diferença entre FTS E como são. Eu li um par de artigos, mas não consegui encontrar nada que explicou bem.

Foi útil?

Solução

Em geral, existe uma troca entre "precisão" e "recolha". meios de alta precisão que menos resultados irrelevantes são apresentados (sem falsos positivos), enquanto meios de alta Lembre-se que menos resultados relevantes estão faltando (sem falsos negativos). Usando o operador LIKE dá-lhe precisão de 100%, sem concessões para recall. Uma instalação de pesquisa de texto completo dá-lhe uma grande flexibilidade para ajustar-se a precisão para melhor recall.

A maioria das implementações de pesquisa de texto completo usar um "índice invertido". Isto é um índice em que as teclas são termos individuais, e os valores associados são conjuntos de registos que contêm o termo. pesquisa de texto completo é otimizado para calcular a interseção, união, etc. destes conjuntos de registros, e, geralmente, fornece um algoritmo de classificação para quantificar quão fortemente um determinado partidas registro de pesquisa palavras-chave.

O operador SQL LIKE pode ser extremamente ineficiente. Se você aplicá-la a uma coluna indexada-un, uma varredura completa será usado para localizar correspondências (assim como qualquer consulta em um campo un-indexada). Se a coluna é indexada, a correspondência pode ser realizada contra chaves de índice, mas com muito menos eficiência do que a maioria das pesquisas de índice. No pior dos casos, o padrão COMO terá wildcards principais que exigem cada chave de índice a ser examinado. Em contraste, muitos sistemas de recuperação de informação pode ativar o suporte para os principais wildcards por árvores de sufixo pré-compilar em áreas selecionadas.

Outras características típicas de pesquisa de texto completo são

  • análise léxica ou quebra-tokenization um bloco de texto não estruturado em palavras individuais, frases e fichas especiais
  • morfológica análise, ou variações decorrentes-colapso de uma dada palavra dentro de um termo do índice; por exemplo, o tratamento de "ratos" e "Mouse", ou "eletrificação" e "Elétrico", como a mesma palavra
  • classificação de medir o semelhança de um registro correspondente a a string de consulta

Outras dicas

FTS envolve indexando as palavras individuais dentro de um campo de texto, a fim de tornar a busca através de muitos registros rápido. Usando COMO ainda exige que você faça uma pesquisa de seqüência (linear ou semelhantes) dentro do campo.

MySQL cria um índice das palavras da pesquisa de coluna e realiza pesquisas de texto completo habilitado neste índice. MySQL usa um algoritmo sofisticado para determinar os registros correspondentes contra a consulta de pesquisa.

Além disso, a partir este SO resposta :

Há algumas vantagens para pesquisa de texto completo.

Indexing:

Algo como:

WHERE Foo LIKE '%Bar';

Não é possível tirar proveito de um índice. Tem de olhar para cada linha, e ver se ele corresponde. Um índice de texto completo, no entanto, pode. Na verdade, índices de texto completo pode oferecer muito mais flexibilidade em termos de ordem de palavras correspondentes, como fechar essas palavras estão juntos, etc.

Stemming:

A pesquisa de texto completo podem conter palavras. Se você procurar prazo, você pode obter resultados para "ran" ou "correr". A maioria dos motores de texto completo tem tronco dicionários em uma variedade de idiomas.

Resultados Ponderadas:

Um índice de texto completo pode abranger várias colunas. Por exemplo, você pode procurar por "torta de pêssego", eo índice pode incluir um título, palavras-chave, e um corpo. Resultados que correspondem ao título pode ser ponderada mais elevada, como mais relevantes, e podem ser classificados para mostrar perto do topo.

Desvantagens:

Um índice de texto completo pode ser potencialmente enormes, muitas vezes maior do que um índice B-tree padrão. Por esta razão, muitos hospedados provedores que oferecem as instâncias de banco de dados desativar esse recurso, ou pelo menos custo extra para ele. Por exemplo, última vez que verifiquei, o Windows Azure não oferece suporte a consultas de texto completo.

índices de texto completo também pode ser mais lento para atualização. Se os dados muda muito, pode haver alguns índices lag atualização comparação com índices normais.

Como usa curingas somente, e não é tudo o que poderoso.

O texto completo permite muita procura mais complexa, incluindo E, OU, NÃO, resultados ainda semelhantes soando (SOUNDEX) e muitos itens mais.

Gostaria de começar a olhar para o SQL contém () FREETEXT () e itens de pesquisa de texto completo relacionados para ajudar a obter uma melhor compreensão do que está disponível.

A verdadeira diferença é as metodologias de digitalização. Para a busca de texto completo, as palavras (termos) são utilizados como chaves de hash - cada um dos quais está associada a uma série de documentos as chaves (termos) aparece em sua como este:.

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

Agora matriz termo-documento (que membro do termo da qual documento) pode ser representado como:

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

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

Você poderia cortar um esquema de-normalizado tabela para armazenar documentos - cada linha na tabela MySQL será considerada como "documento" e uma coluna de texto poderia conter um parágrafo etc. O índice invertido conterá os termos como chaves de hash ea row-ids como os iDs de documentos.

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

  1. Número de palavras / termos na coluna de texto
  2. O número de linhas / documentos correspondentes aos critérios
  3. O comprimento dos termos / palavras

Por exemplo dessa SQL poderia ser demitido para extrair todas as linhas correspondentes a dada XYZ palavra:

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

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

O COMO porém não tem nada disso. Ele é forçado a varredura linearmente a sentença / string e encontrar todos os termos correspondentes. Adicionando wild card aumenta a confusão. Ele funciona muito bem para pequenas cadeias de comprimento, como você pode imaginar, mas irá falhar miseravelmente para sentenças mais longas. E definitivamente não é comparável ao ter um parágrafo ou uma página inteira de texto etc.

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top