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

War es hilfreich?

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

verbrauchen

hier ist ein Beispiel auf c #

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top