Question

Je propose une option de recherche pour mes utilisateurs. Ils peuvent rechercher le nom de la ville. Le problème, c’est que les noms de ville que j’ai stockés sont des mots tels que "Saint Louis". Mais je veux trouver Saint-Louis même si l’utilisateur tape "St. Louis " ou "St Louis". Des suggestions sur la façon dont je pourrais créer une table de consultation pour en tenir compte?

Était-ce utile?

La solution

Créez deux tables.

L'un contient tout ce qui concerne une ville.

L'un contient un groupe de noms pour les villes et une association de clés étrangères avec le même identifiant que celui de la première table. Vous avez donc une relation un à plusieurs entre city et city_names.

Maintenant, le seul problème est de distinguer le nom, pour chaque ville, qui est le nom préféré. Nous pouvons le faire de différentes manières: 1) la première table pourrait avoir un fk pour la seconde table, qui conserve l'identifiant du nom préféré. Cela crée cependant une dépendance circulaire. Donc mieux, 2) ajoutez simplement une colonne booléen / bit à la deuxième table, 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  
) ;

Ensuite, pour obtenir tous les noms, avec le nom préféré en premier:

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

Cela présente un avantage supplémentaire: si vous ne couvrez pas toutes les villes, vous pouvez utiliser le second tableau pour cartographier les villes / villages / comtés que vous ne couvrez pas avec les grandes villes que vous fréquentez:

 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');

Autres conseils

Ce que je ferais, c’est de construire un tableau abrégé normal, qui mapperait tout mot ambigu avec une seule orthographe cohérente que vous utiliserez dans votre tableau principal. Vous pouvez y inclure des fautes d’orthographe et des fautes de frappe courantes.

Avant de consulter la demande de l'utilisateur, convertissez tous les mots en forme normale à l'aide de ce tableau.

Donc, dans votre cas, dans la table raccourci à la normale , nous aurons

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

Vous voudrez peut-être envisager un moteur de recherche en texte intégral plus complet, tel que Apache Lucene / Solr ou Sphinx - qui peut prendre en charge ce type de mappage de chaînes de manière native.

Je vois un certain nombre de façons possibles de gérer cela. L'un est un soundex qui correspond à la similarité des chaînes anglaises. En outre, cela est pris en charge de manière native dans certaines bases de données telles que PostgreSQL .

Une autre approche consiste peut-être simplement à offrir à vos utilisateurs une fonctionnalité de saisie automatique dans laquelle un certain nombre de suggestions apparaissent au fur et à mesure de leur frappe. De cette façon, les utilisateurs choisiront le nom de la ville de recherche souhaitée de manière intuitive.

En règle générale, vous pouvez normaliser les éléments lors de leur insertion et de leur recherche.

Les règles de normalisation peuvent être:

Saint => St
St. => St

etc.

Les noms normalisés doivent alors correspondre.

À mon humble avis, je laisserais la base de données seule et disposerais plutôt d’une liste détaillée des villes dans votre application. Plus facile, plus propre, et ne nécessite pas beaucoup plus.

J'aime bien l'option de la première réponse.

Une autre idée serait d’avoir une colonne pour les tags de cette ville que les utilisateurs pourraient mettre à jour.

c'est-à-dire

New York est le nom officiel.

Les balises pour cette ville seraient numérotables (Manhattan, NY, NYC, la ville, grosse pomme ..) e.t.c. mais vous ne voudriez pas que tout ce bric-à-brac de votre table principale de villes ou créer des tables enfants associées et effectuer des jointures. Il suffit donc de le placer dans une colonne et de le rechercher en fonction du terme recherché, puis de renvoyer le nom correct s’il est trouvé.

Vous pouvez utiliser les propriétés FTS SQL intégrées dans les entrées de dictionnaire des synonymes. Cela vous permet de créer une carte de mots personnalisée dans la recherche en texte intégral. De cette façon, vous pouvez tout conserver dans FTS plutôt que de mélanger FTS et d’autres requêtes.

Vous ne savez pas quelle version de SQL que vous utilisez diffère de 2005/8, il existe donc une bonne procédure pour 2005/8 ici http://arcanecode.com/2008/05/28/creating-custom -thesaurus-entrées-dans-serveur-SQL-2005-et-2008-recherche en texte intégral /

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top