Correspondance la plus proche pour la recherche en texte intégral
-
19-08-2019 - |
Question
J'essaie de mettre en œuvre une recherche interne sur mon site Web qui puisse orienter les utilisateurs dans la bonne direction au cas où le mot de frappe entrerait un mot, quelque chose comme le veux-tu dire : dans la recherche google.
Quelqu'un at-il une idée de la manière dont une telle recherche peut être effectuée? Comment pouvons-nous établir la pertinence du mot ou de la phrase que nous supposons que l'utilisateur a l'intention de rechercher?
- J'utilise asp.net et SQL Server 2005 avec FTS (fullTextSearch)
Merci
La solution
Vous pouvez utiliser un algorithme pour déterminer la similarité des chaînes, puis suggérer une autre chaîne à partir de votre index de recherche, jusqu'à une certaine différence.
L'un de ces algorithmes est la distance de Levenshtein .
Cependant, n'oubliez pas de rechercher des solutions existantes. Je pense par exemple Lucene permet de rechercher des chaînes similaires.
Btw, voici un article sur ce sujet: Comment Google? Vouliez-vous dire? L'algorithme fonctionne-t-il?
Autres conseils
Ceci consiste à interroger par expression régulière les mots-clés les plus proches correspondant à la phrase.
Voici un excellent article qui pourrait vous aider.
Avec T-SQL Vous pouvez utiliser le SOUNDEX
fonction permettant de comparer les mots phonétiquement.
Si vous prenez les entrées des utilisateurs et que vous les comparez ensuite avec d'autres mots de votre base de données à l'aide du code soundex, vous devriez être capable de créer une liste de "voulez-vous dire"? mots.
ex.
select SOUNDEX('andrew')
select SOUNDEX('androo')
produira tous les deux la même sortie (A536).
Il existe de meilleurs algorithmes de nos jours, mais soundex est intégré au serveur SQL.
L’approche la plus simple à laquelle je puisse penser est d’écrire une fonction qui renvoie le degré de discordance entre deux mots et vous permet de parcourir tous les mots et de trouver les meilleurs.
Je l'ai fait avec une méthode de branchement et de liaison. Laissez-moi déterrer le code:
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;
}
pourquoi n'utilisez-vous pas google power?, vous pouvez utiliser leur service de suggestion
voici un exemple sur c #