Frage

Ich biete eine Suchoption für meine Nutzer. Sie können auf Stadtnamen suchen. Das Problem ist, dass meine Stadt Namen, die ich gespeichert haben, sind Dinge wie „Saint Louis“. Aber ich will in „St. Louis“ Saint Louis, selbst wenn der Benutzer tippt finden oder „St Louis“. Alle Vorschläge, wie ich eine Lookup-Tabelle erstellen könnte irgendwie, dass zu berücksichtigen?

War es hilfreich?

Lösung

Erstellen zwei Tabellen.

Eine enthält alles über eine Stadt.

Eine enthält eine Reihe von Namen für Städte und einen Fremdschlüssel Vereinigung jener Näs mit der ID der ersten Tabelle. So haben Sie eine one to many Beziehung zwischen Stadt und city_names.

Jetzt ist das einzige Problem ist die Unterscheidung der einen Namen für jede Stadt, das ist der bevorzugte Name. Wir können tun, dass ein paar Möglichkeiten: 1) die erste Tabelle eine fk zu der zweiten Tabelle haben könnte, die zu ID des bevorzugten Namen hält. Dies schafft eine zirkuläre Abhängigkeit, though. Also besser, 2) fügen Sie einfach eine boolean / Bit Spalte der zweiten Tabelle is_preffered.

create table city (id not null primary key, other columns ) ;

create table city_name (
 id not null primary key, 
 city_id int references city(id), 
 name varchar(80),
 is_preferred bool  
) ;

Dann sind alle Namen zu bekommen, mit dem bevorzugten Namen zuerst:

   select name from city_names where city_id = ? 
   order by is_preffered desc, name;

Dies hat einen zusätzlichen Vorteil: Wenn Sie jede Stadt und Gemeinde nicht abdecken, können Sie die zweite Tabelle verwenden Städte / Dörfer / Landkreise zu bilden Sie zu den wichtigsten Städten nicht decken Sie tun:

 insert into city_name(city_id, name) values
 ( $id-for-New-York-City, 'New York'),
 ( $id-for-New-York-City, 'Manhattan'),
 ( $id-for-New-York-City, 'Big Apple'),
 ( $id-for-New-York-City, 'Brooklyn');

Andere Tipps

Was würde ich tun, ist, bauen eine Kurz zu normalen Tisch, dass jedes mehrdeutige Wort auf eine einzige konsistente Schreibweise Karte würden Sie in Ihrem primären Tabelle verwendet werden. Sie können es gemeinsame Rechtschreibfehler und Tippfehler enthalten.

Bevor die Anforderung des Benutzers nach oben, konvertieren alle Wörter zu Normalform dieser Tabelle.

So in Ihrem Fall in der shorthand-to-normal Tabelle haben wir

 ______________
| short|normal |
|______|_______|
|St    |Saint  |
|St.   |Saint  |

Sie könnten in eine voll funktionsfähige Volltextsuchmaschine aussehen wollen wie Apache Lucene / Solr oder Sphinx -., die nativ diese Art von String-Mapping unterstützen

Ich sehe eine Reihe von Möglichkeiten, um damit umzugehen. Eine davon ist ein soundex Nachschlagealgorithmus rel="nofollow, die die Ähnlichkeit der englischen Strings übereinstimmt. Darüber hinaus wird diese unterstützt nativ in einigen Datenbanken wie PostgreSQL .

Ein weiterer Ansatz kann einfach Ihre Benutzer eine Auto-Funktionalität zu bieten, wo, wie sie erscheinen eine Reihe von Vorschlägen geben. Auf diese Weise Benutzer intuitiv die gewünschten Lookup Ortsnamen auswählen.

Als allgemeiner Ansatz, Sie können Elemente normalisieren sowohl beim Einsetzen und bei der Such sich.

Normalisierungsregeln könnten sein:

Saint => St
St. => St

etc.

Die normalisierten Namen sollten dann entsprechen.

IMHO würde ich die Datenbank allein lassen und stattdessen eine Downdown Liste der Städte in der Anwendung hat. Einfacher, saubere und erfordert nicht viel extra dazu bekommen.

Ich mag die Möglichkeit, in der ersten Antwort.

Ein anderer Gedanke wäre eine Spalte für Tags für diese Stadt zu haben, dass die Benutzer coudl zu aktualisieren.

d.

New York City ist der offizielle Name.

Tags für diese Stadt würde zählbar (Manhattan, NY, NYC, die Stadt, big apple ..) sein e.t.c. aber Sie würden alles, was Junk in Ihrem Haupt-Städte-Tabelle nicht wollen oder assicated Kind Tabellen erstellen und zu tun, verbindet. Also einfach verstauen es in einem Spalten und suchen sie auf der Grundlage der Suchbegriff aber dann den richtigen Namen zurück, wenn es gefunden wird.

Sie können die für Thesaurus Einträge in SQL FTS Eigenschaften gebaut verwenden. Auf diese Weise können Sie eine benutzerdefinierte Wortkarte innerhalb Volltextsuche buld. So können Sie alles in FTS statt mischen FTS und andere Anfragen halten.

Nicht sicher, welche Version von SQL Sie als differant zwischen 2005/8 so verwenden gibt es eine gute Anleitung für 2005/8 hier http://arcanecode.com/2008/05/28/creating-custom -thesaurus-Einträge-in-sQL-Server-2005-und 2008-Volltextsuche /

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