Domanda

Sto offrendo un'opzione di ricerca per i miei utenti. Possono cercare il nome della città. Il problema è che i nomi delle mie città che ho memorizzato sono cose come "Saint Louis". Ma voglio trovare Saint Louis anche se l'utente digita " St. Louis " o "St Louis". Qualche suggerimento su come potrei creare una tabella di ricerca per tenerne conto in qualche modo?

È stato utile?

Soluzione

Crea due tabelle.

Uno contiene tutto ciò che riguarda una città.

Uno contiene un sacco di nomi per le città e un'associazione di chiavi esterne quelle naes con l'id della prima tabella. Quindi hai una o più relazioni tra city e city_names.

Ora l'unico problema è distinguere un nome, per ogni città, che è il nome preferito. Possiamo farlo in un paio di modi: 1) la prima tabella potrebbe avere un fk alla seconda tabella, che mantiene l'ID del nome preferito. Questo crea però una dipendenza circolare. Quindi, meglio 2) aggiungi semplicemente una colonna booleana / bit alla seconda tabella, 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  
) ;

Quindi per ottenere tutti i nomi, prima con il nome preferito:

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

Questo ha un ulteriore vantaggio: se non copri tutte le città, puoi usare la seconda tabella per mappare città / paesi / contee che non copri con le principali città che fai:

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

Altri suggerimenti

Quello che vorrei fare è, costruire una tabella abbreviata alla normalità, che associ qualsiasi parola ambigua a una singola ortografia coerente che userete nella tabella principale. Puoi includere errori di ortografia e errori di battitura comuni.

Prima di cercare la richiesta dell'utente, converti tutte le parole in forma normale usando questa tabella.

Quindi nel tuo caso nella tabella dalla stenografia alla normale avremo

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

Potresti voler esaminare un motore di ricerca full-text più completo come Apache Lucene / Solr o Sphinx - che può supportare nativamente questo tipo di mappatura delle stringhe.

Vedo un numero di possibili modi per affrontarlo. Uno è un soundex algoritmo di ricerca che corrisponde alla somiglianza delle stringhe inglesi. Inoltre, questo è supportato in modo nativo in alcuni database come PostgreSQL .

Un altro approccio potrebbe essere semplicemente quello di offrire ai tuoi utenti una funzionalità di completamento automatico in cui compaiono una serie di suggerimenti. In questo modo gli utenti sceglieranno il nome della città di ricerca desiderata in modo intuitivo.

Come approccio generale, puoi normalizzare gli elementi sia durante l'inserimento che durante la ricerca.

Le regole di normalizzazione potrebbero essere:

Saint => St
St. => St

ecc.

I nomi normalizzati dovrebbero quindi corrispondere.

IMHO lascerei da solo il database e invece avrei un elenco a discesa delle città nella tua applicazione. Più facile, più pulito e non richiede molto extra.

Mi piace l'opzione nella prima risposta.

Un altro pensiero sarebbe quello di avere una colonna per i tag per quella città che gli utenti potrebbero aggiornare.

cioè.

New York City è il nome ufficiale.

I tag per questa città sarebbero numerabili (Manhattan, New York, New York, la città, grande mela ..) e.t.c. ma non vorresti tutta quella roba indesiderata nel tuo tavolo Città principale o creare tavoli figlio assicurati e devi unirti. Quindi basta inserirlo in una colonna e cercarlo in base al termine di ricerca, ma quindi restituire il nome corretto se viene trovato.

È possibile utilizzare le proprietà SQL FTS integrate per le voci del thesaurus. Ciò consente di creare una mappa di parole personalizzata all'interno della ricerca full-text. In questo modo puoi tenere tutto all'interno di FTS piuttosto che mescolare FTS e altre query.

Non sono sicuro di quale versione di SQL stai usando come diversa tra il 2005/8 quindi c'è una buona soluzione per il 2005/8 qui http://arcanecode.com/2008/05/28/creating-custom -thesaurus-voci-in-sql-server-2005-e-2008-full-text-search /

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top