Pregunta

Estoy ofreciendo una opción de búsqueda para mis usuarios. Pueden buscar el nombre de la ciudad. El problema es que los nombres de mi ciudad que he almacenado son cosas como "Saint Louis". Pero quiero encontrar Saint Louis, incluso si el usuario escribe "St. Louis " o "St Louis". ¿Alguna sugerencia sobre cómo podría crear una tabla de búsqueda para tener eso en cuenta de alguna manera?

¿Fue útil?

Solución

Cree dos tablas.

Uno contiene todo sobre una ciudad.

Uno contiene un montón de nombres para ciudades, y una asociación de claves foráneas esas naes con la identificación de la primera tabla. Entonces tienes una relación de uno a muchos entre city y city_names.

Ahora el único problema es distinguir el nombre único, para cada ciudad, que es el nombre preferido. Podemos hacerlo de dos maneras: 1) la primera tabla podría tener un fk a la segunda tabla, que se mantiene con el id del nombre preferido. Sin embargo, esto crea una dependencia circular. Mejor aún, 2) simplemente agregue una columna booleana / bit a la segunda tabla, 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  
) ;

Luego, para obtener todos los nombres, con el nombre preferido primero:

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

Esto tiene una ventaja adicional: si no cubre todas las ciudades y pueblos, puede usar la segunda tabla para mapear pueblos / aldeas / condados que no cubre a las principales ciudades que hace:

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

Otros consejos

Lo que haría es construir una tabla abreviada a la normal, que mapearía cualquier palabra ambigua a una sola ortografía consistente que usará en su tabla principal. Puede incluir errores ortográficos y errores tipográficos comunes.

Antes de buscar la solicitud del usuario, convierta todas las palabras a la forma normal usando esta tabla.

Entonces, en su caso, en la tabla abreviatura a normal tendremos

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

Es posible que desee buscar un motor de búsqueda de texto completo más completo, como Apache Lucene / Solr o Sphinx , que puede admitir este tipo de mapeo de cadenas de forma nativa.

Veo varias formas posibles de lidiar con esto. Uno es un soundex algoritmo de búsqueda que coincide con la similitud de las cadenas en inglés. Además, esto es compatible de forma nativa en algunas bases de datos como PostgreSQL .

Otro enfoque puede ser simplemente ofrecer a sus usuarios una funcionalidad de autocompletar donde, a medida que escriben, aparecen varias sugerencias. De esta forma, los usuarios elegirán el nombre de la ciudad de búsqueda deseada intuitivamente.

Como enfoque general, puede normalizar elementos tanto al insertarlos como al buscarlos.

Las reglas de normalización podrían ser:

Saint => St
St. => St

etc.

Los nombres normalizados deberían coincidir.

En mi humilde opinión, dejaría la base de datos sola y en su lugar tendría una lista de ciudades en su aplicación. Más fácil, más limpio y no requiere mucho más.

Me gusta la opción en la primera respuesta.

Otra idea sería tener una columna de etiquetas para esa ciudad que los usuarios podrían actualizar.

es decir

Nueva York es el nombre oficial.

Las etiquetas para esta ciudad serían numerables (Manhattan, NY, NYC, la ciudad, la gran manzana ...) e.t.c. pero no querrás toda esa basura en tu tabla principal de Ciudades o crear tablas secundarias dedicadas y tener que hacer uniones. Así que solo mételo en una columna y búscalo según el término de búsqueda, pero luego devuelve el nombre correcto si se encuentra.

Puede usar las propiedades incorporadas de SQL FTS para las entradas del diccionario de sinónimos. Esto le permite agrupar un mapa de palabras personalizado dentro de la búsqueda de texto completo. De esa manera, puede mantener todo dentro de FTS en lugar de mezclar FTS y otras consultas.

No estoy seguro de qué versión de SQL está utilizando como diferente entre 2005/8, por lo que hay un buen tutorial para 2005/8 aquí http://arcanecode.com/2008/05/28/creating-custom -thesaurus-inputs-in-sql-server-2005-and-2008-full-text-search /

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top