Frage

Hier ist mein Problem. Zum Beispiel habe ich eine Tabelle Produkte , die ein Feld enthält, Name :

Products
ID | Name | ..
1  | "USB Key 10Go"
2  | "Intel computer"
3  | "12 inches laptop computer"
...

Ich bin gerade eine einfache Suchmaschine (SQL Server und ASP .NET, C #) für eine iPhone Web-App-Implementierung und ich mag die SOUNDEX() SQL Server-Funktion verwenden.

Die Sache ist, kann es nicht direkt verwenden SOUNDEX auf dem Namen Feld. (Dies würde irrelevant sein, da es mehrere Worte im Namen ist.) Ich mag würde die SOUNDEX Funktion jedes Wort aus dem Namen Feld anwenden und dann sehen, ob einer von ihnen entspricht das recherchierten Schlüsselwort.

Wenn jemand eine Ahnung hat, wie dies zu tun, das wäre genial.

War es hilfreich?

Lösung

Haben Sie sich in die Volltextsuche-Funktion in SQL Server? Ich weiß, das ist nicht genau das, was Sie gefragt. Es ist nur, dass die SOUNDEX () Funktion verwendet wird, ähnlich klingende Namen zu finden (EX: SMITH und SMYTHE gleich klingen). In einer Suchmaschine jedoch, wie ein Wort klingt, ist weniger wichtig als die Suchworte selbst. Volltextsuche können Sie auch Synonyme verwenden (so dass Sie bestimmte Wörter angeben, die die gleiche Sache in Ihrer Anwendung Kontext bedeuten), und haben sie automatisch bei der Suche berücksichtigt.

Sehen Sie sich diese Seiten für weitere Informationen über die Volltextsuche in SQL Server:

Einführung in die Volltextsuche

ENTHÄLT

CONTAINS

FREETEXT-

FREETEXTTABLE

Andere Tipps

Anstatt Verwendung Soundex Sie vielleicht besser dran, den Levenshtein Abstand zwischen den beiden Strings zu berechnen. Siehe der Wikipedia-Artikel über Levenshtein Abstand .

Es gibt eine TSQL Umsetzung des Levenshtein-Distanz-Algorithmus hier .

Teile und genießen.


EDIT 03-May-2012

Da meine ursprüngliche Antwort schreiben Ich habe gelernt, dass Oracle die Levenshtein-Distanz und einige andere „string Ähnlichkeit“ Funktionen im UTL_MATCH Paket beinhaltet, die ich glaube, zu einem festen Bestandteil der Datenbank ist. Dokumentation hier . Vielleicht nicht direkt mit dem ursprünglichen Post bezogen (die für SQL Server war), aber vielleicht nützlich, da viele Geschäfte mehr Datenbanken verwenden.

Wenn Sie haben sie alle in den RDBMS zu tun, ein UDF wäre der beste wenn es eine Option.

Andernfalls könnten Sie diese Technik, um zumindest verwenden soundex die ersten vier Wörter einzeln mit Wie kann ich eine Zeichenfolge geteilt, so kann ich Artikel zugreifen x? :

PARSENAME(REPLACE('12 inches laptop computer', ' ', '.'), 1)  --return computer
PARSENAME(REPLACE('12 inches laptop computer', ' ', '.'), 2)  --return laptop
...

Allerdings: mit ParseName auf diese Weise ist ein Hack und eine ernsthafte Einschränkung ist es nur für maximal 4 Teile funktioniert. Wenn es 5 oder mehr Wörter ParseName NULL zurück, so dass Sie für die mit einer bedingten zu überprüfen und zu erniedrigen anmutig.

Hier ist ein vereinfachtes Beispiel (wieder, ohne die NULL überprüft)

SELECT *
FROM Products 
WHERE SOUNDEX(search_input) = SOUNDEX(PARSENAME(REPLACE(Name, ' ', '.'), 4))
  OR SOUNDEX(search_input) = SOUNDEX(PARSENAME(REPLACE(Name, ' ', '.'), 3))
  OR SOUNDEX(search_input) = SOUNDEX(PARSENAME(REPLACE(Name, ' ', '.'), 2))
  OR SOUNDEX(search_input) = SOUNDEX(PARSENAME(REPLACE(Name, ' ', '.'), 1))

Die SOUNDEX kann eine perfekte Passform für Ihre purpuse sein, aber bitte denken Sie daran, dass es keine guten Ergebnisse für alles liefern kann anders als britisches oder amerikanisches Englisch gesprochenen Worte! Es kann sogar auf Deutsch phonetisch gesprochenen Worte verwendet werden, aber es wird mit etwas anderem nicht gut funktionieren.

Sie könnten versuchen, den Metaphone jedes mit Bindestrichen verketteten Wort zu speichern. EG stored_metaphone Feld so etwas wie '-AKTRF-SPLS-' enthalten könnte. Dann bauen eine Abfrage wie folgt aus:

$where = '(';
$search_sql = array();
$search_terms = explode(' ',$search);
foreach ($search_terms as $term) {
    $search_sql[] = "`stored_metaphone` LIKE '%-".metaphone($term)."-%'";
}
$where .= implode(' OR ',$search_sql);
$where .= ')';

NB dies ist nur der WHERE-Teil der Abfrage.

Soweit ich weiß, Metaphone funktioniert nur mit Englisch. Die obige SQL funktioniert recht gut auf einer Reihe von Standorten.

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