Closest Spiel für Volltextsuche
-
19-08-2019 - |
Frage
Ich versuche, eine interne Suche für meine Website zu implementieren, die Benutzer in die richtige Richtung, falls die vertippen ein Wort zeigen kann, so etwas wie das meinten Sie . In Google-Suche
Hat jemand eine Idee, wie eine solche Suche kann getan werden? Wie können wir die Relevanz des Wortes etablieren oder die Phrase, die wir den Benutzer übernehmen, die für die Suche?
- Ich benutze asp.net und SQL Server 2005 mit FTS (Volltextsuche)
Danke
Lösung
Sie können einen Algorithmus zur Bestimmung Zeichenfolge Ähnlichkeit verwenden und schlagen dann andere Zeichenfolge aus dem Suchindex zu einem gewissen Unterschied auf.
Einer dieser Algorithmen ist die Levenshtein Abstand .
Doch vergessen Sie nicht für bestehende Lösungen zu suchen. Ich denke zum Beispiel Lucene hat die Fähigkeit, nach ähnlichen Strings zu suchen.
Btw, ist hier eine ähnliche Post zu diesem Thema: Wie hat die Google „meinen Sie?“ Algorithmus arbeiten?
Andere Tipps
Dies geschieht durch reguläre Ausdrücke, die am nächsten Schlüsselwort Abfrage, die die Phrase entspricht.
Hier ist ein großer Artikel, die Ihnen helfen.
Mit T-SQL können Sie verwenden, um die SOUNDEX
Funktion vergleichen Wörter lautlich.
Wenn Sie den Benutzer Eingang nehmen und dann vergleichen Sie es mit anderen Worten in der Datenbank von soundex Code, sollten Sie in der Lage sein, mit einer Liste kommen von ‚meinst du?‘ Wörter.
z.
select SOUNDEX('andrew')
select SOUNDEX('androo')
wird sowohl produzieren die gleiche Leistung (A536).
Es gibt bessere Algorithmen in diesen Tagen, aber soundex in SQL Server aufgebaut.
Der einfachste Ansatz, den ich denken kann, ist eine Funktion zu schreiben, die den Grad der Nichtübereinstimmung zwischen zwei Wörtern gibt, und Sie eine Schleife durch alle Wörter und finden Sie die besten.
Ich habe dies getan, mit einer Branch-and-gebundener Methode. Ich will den Code graben:
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;
}
, warum Sie nicht Google Energie verwenden ?, können Sie ihre vorschlagen Service
verbrauchenhier ist ein Beispiel auf c #