5

Ich versuche eine interne Suche für meine Website zu implementieren, die Benutzer in die richtige Richtung zeigen kann, falls der Tipp ein Wort, etwas wie die hast du meinst: in Google-Suche.Das nächste Spiel für die Volltextsuche

Hat jemand eine Idee, wie eine solche Suche durchgeführt werden kann? Wie können wir die Relevanz des Wortes oder der Phrase, von der wir annehmen, dass der Benutzer sie suchen wollte, feststellen?

  • ich verwende asp.net und SQL Server 2005 mit FTS (Volltextsuche)

Danke

Antwort

4

Sie können einen Algorithmus zum Bestimmen der Zeichenfolgenähnlichkeit verwenden und dann eine andere Zeichenfolge aus Ihrem Suchindex vorschlagen, bis zu einem bestimmten Unterschied.

Einer dieser Algorithmen ist der Levenshtein distance.

Vergessen Sie jedoch nicht, nach vorhandenen Lösungen zu suchen. Ich denke z.B. Lucene kann nach ähnlichen Zeichenfolgen suchen.

Btw, ist hier ein verwandtes Post zu diesem Thema: How does the Google “Did you mean?” Algorithm work?

+0

Ich wusste nicht einmal, wie ein solcher Algorithmus existiert !!! – ak3nat0n

0

Der einfachste Ansatz, den ich denken kann, ist eine Funktion zu schreiben, die den Grad der Nichtübereinstimmung zurück zwischen zwei Wörtern, und Sie durchlaufen alle Wörter und finden die besten.

Ich habe dies mit einer Branch-and-Bound-Methode getan. Lassen Sie mich den Code ausgraben:

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; 
} 
2

Dies ist getan durch Abfragen von regulären Ausdruck die engsten Suchbegriffe, die die Phrase entsprechen.

Here ist ein großer Artikel, der Ihnen helfen könnte.

+0

der Tat ein sehr guter Artikel. +1 –

+0

+1 für den Artikel. Aber ich denke, es ist nicht das, wonach gefragt wird. =) Die fragliche Funktionalität ist eher "Hast du Jon Skeet gemeint?" wenn jemand nach "Guru" sucht. – PEZ

+0

hahahaha .... dafür brauchst du KI. –

0

Mit T-SQL können Sie die SOUNDEX Funktion verwenden Wörter phonetisch zu vergleichen.

Wenn Sie die Benutzereingaben nehmen und sie dann mit anderen Wörtern in Ihrer Datenbank mit Soundex-Code vergleichen, sollten Sie in der Lage sein, eine Liste von "Do you mean" zu erstellen? Wörter.

z.

select SOUNDEX('andrew') 
select SOUNDEX('androo') 

werden beide die gleiche Ausgabe (A536) produzieren.

Es gibt heutzutage bessere Algorithmen, aber Soundex ist in SQL Server integriert.

0

warum Sie Google Macht nicht verwenden ?, können Sie ihren Dienst vorschlagen verbrauchen

here ist ein Beispiel auf C#