Mais próximo jogo para Full Text Search
-
19-08-2019 - |
Pergunta
Eu estou tentando implementar uma pesquisa interna para o meu site que pode apontar os usuários na direção certa no caso do mistype uma palavra, algo parecido com o que você quis dizer : em busca google
Alguém tem uma idéia de como tal busca um pode ser feito? Como podemos estabelecer a relevância da palavra ou a frase assumimos o utilizador pretende procurar?
- i usar asp.net e sql server 2005 com STF (texto integral)
Obrigado
Solução
Você pode usar um algoritmo para determinar similaridade corda e, então, sugerir outra seqüência de sua pesquisa de índice até uma certa diferença.
Um desses algoritmos é a Levenshtein distância .
No entanto, não se esqueça buscando soluções existentes. Eu acho que por exemplo Lucene tem a capacidade de procurar cadeias semelhantes.
Aliás, aqui está um post relacionado sobre este tema: Como é que o Google “você quis dizer?” Algoritmo de trabalho?
Outras dicas
Isto é feito através de consulta expressão regular as palavras-chave mais próximos que correspondem a frase.
Aqui é um ótimo artigo que pode ajudá-lo.
Com T-SQL Você pode usar a função SOUNDEX
para comparar as palavras foneticamente.
Se você pegar a entrada de usuários e, em seguida, compará-lo com outras palavras em seu banco de dados por código soundex, você deve ser capaz de chegar a uma lista de 'você quer dizer? palavras.
por exemplo.
select SOUNDEX('andrew')
select SOUNDEX('androo')
será tanto produzir a mesma saída (A536).
Existem melhores algoritmos estes dias, mas soundex é construído em sql server.
A abordagem mais simples que posso pensar é escrever uma função que retorna o grau de incompatibilidade entre duas palavras, e você percorra todas as palavras e encontrar as melhores.
Eu fiz isso com um método vinculado branch-and-. Deixe-me desenterrar o código:
bool matchWithinBound(char* a, char* b, int bound){
// skip over matching characters
while(*a && *b && *a == *b){a++; b++;}
if (*a==0 && *b==0) return true;
// if bound too low, quit
if (bound <= 0) return false;
// try assuming a has an extra character
if (*a && matchWithinBound(a+1, b, bound-1)) return true;
// try assuming a had a letter deleted
if (*b && matchWithinBound(a, b+1, bound-1)) return true;
// try assuming a had a letter replaced
if (*a && *b && matchWithinBound(a+1, b+1, bound-1)) return true;
// try assuming a had two adjacent letters swapped
if (a[0] && a[1]){
char temp;
int success;
temp = a[0]; a[0] = a[1]; a[1] = temp;
success = matchWithinBounds(a, b, bound-1);
temp = a[0]; a[0] = a[1]; a[1] = temp;
if (success) return true;
}
// can try other modifications
return false;
}
int DistanceBetweenWords(char* a, char* b){
int bound = 0;
for (bound = 0; bound < 10; bound++){
if (matchWithinBounds(a, b, bound)) return bound;
}
return 1000;
}
Por que você não usa o Google poder ?, você pode consumir a sua sugerem serviço
aqui é um exemplo em c #