Pergunta

Eu estou oferecendo uma opção de pesquisa para meus usuários. Eles podem pesquisar em nome da cidade. O problema é que meus nomes de cidades que tenho armazenados são coisas como "Saint Louis". Mas eu quero encontrar Saint Louis, mesmo se o usuário digita "St. Louis" ou "St Louis". Todas as sugestões sobre como eu poderia criar uma tabela de pesquisa que levar isso em conta de alguma forma?

Foi útil?

Solução

Criar dois tabelas.

Um contém tudo sobre a cidade.

Uma contém um monte de nomes de cidades, e uma associação de chave estrangeira essas naes com o id primeira tabela a. Então você tem um para muitos relação entre cidade e city_names.

Agora, o único problema é distinguir o nome de um, para cada cidade, que é o nome preferido. Nós podemos fazer isso de duas maneiras: 1) a primeira tabela pode ter um fk para a segunda tabela, que contém a identificação do nome preferido. Isso cria uma dependência circular, no entanto. Então é melhor, 2) basta adicionar uma coluna booleana / bit para a segunda tabela, 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  
) ;

Depois de obter todos os nomes, com o nome preferido em primeiro lugar:

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

Isto tem uma vantagem adicional: se você não cobrir cada cidade e cidade, você pode usar a segunda tabela para mapear cidades / vilas / municípios que não cobrem as principais cidades que você faz:

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

Outras dicas

O que eu faria é, construir uma tabela abreviada-a-normal, que seria mapear qualquer palavra ambígua a uma única ortografia consistente você vai usar em sua tabela primária. Você pode incluir lá erros ortográficos comuns e erros de digitação.

Antes de olhar-se a solicitação do usuário, converter todas as palavras de forma normal usando esta tabela.

Assim, no seu caso na tabela de shorthand-to-normal teremos

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

Você pode querer olhar para um motor de busca de texto completo com mais recursos, como Apache Lucene / Solr ou Esfinge -. que pode suportar este tipo de mapeamento corda nativamente

Eu vejo uma série de possíveis maneiras de lidar com isso. Um deles é um soundex lookup algoritmo que corresponde a similaridade de strings Inglês. Além disso, esta é suportada nativamente em alguns bancos de dados como PostgreSQL .

Outra abordagem pode ser simplesmente para oferecer aos seus utilizadores uma funcionalidade de auto-completar, onde uma vez que digitar um número de sugestões aparecem. Desta forma, os usuários vão escolher o nome da cidade de pesquisa desejado intuitivamente.

Como uma abordagem geral, você pode normalizar itens tanto ao inserir e na busca-los.

As regras de normalização poderia ser:

Saint => St
St. => St

etc.

Os nomes normalizados deve então corresponder.

IMHO eu deixaria o banco de dados por si só, mas que possuem uma lista downdown de cidades na sua aplicação. Mais fácil, mais limpo e não exige muito extra.

I como a opção na primeira resposta.

Outro pensamento seria ter uma coluna para tags para essa cidade que os usuários coudl atualização.

i.

New York City é o nome oficial.

Tags para esta cidade seria numerable (Manhattan, NY, NYC, a cidade, maçã grande ..) e.t.c. mas você não gostaria que todo esse lixo em sua tabela de Cidades principal ou para criar tabelas filho assicated e tem que fazer se junta. Então, basta colocá-la em um colunas e busca-lo com base na Pesquisa prazo, mas, em seguida, retornar o nome próprio, se ele é encontrado.

Você pode usar o construída em propriedades SQL SFT para as entradas do dicionário de sinônimos. Isso permite que você buld um mapa de palavras personalizadas dentro pesquisa de texto completo. Dessa forma, você pode manter tudo dentro do STF em vez de FTS mix e outras consultas.

Não tenho certeza qual versão do SQL que você está usando como sua differant entre 2005/8 para que haja um bom passo a passo para 2005/8 aqui http://arcanecode.com/2008/05/28/creating-custom -thesaurus-entradas-em-sql-server-2005-e-2008-full-text-procurar /

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top