Pergunta

O problema é que há um banco de dados com cerca de 20k registros de clientes e quero fazer um melhor esforço para evitar entradas duplicadas. O banco de dados é o Microsoft SQL Server 2005, o aplicativo que mantém o banco de dados é o Microsoft Dynamics / SL. Estou criando um webservice ASP.NET que interage com esse banco de dados. Meu serviço pode inserir registros de clientes no banco de dados, ler os registros a partir dele, ou modificar esses registros. Ou no meu webservice, ou através de MS Dynamics, ou no SQL Server, eu gostaria de dar uma lista de possíveis correspondências antes de um usuário confirma um novo recorde add.

Assim, o usuário iria apresentar um registro, se ele parece ser único, o registro vai salvar e retornar um novo ID. Se existem possíveis duplicações, o usuário poderá reenviar com uma confirmação dizendo: "Sim, eu vejo as possíveis repetições, este é um novo recorde, e eu quero apresentá-lo".

Isso é fácil se é apenas uma coisa de pontuação ou espaço (como se você está entrando "Company, Inc." e há uma "Company Inc" no banco de dados, Mas o que se há pequenas mudanças, como " empresa Corp." em vez de 'Company Inc' ou se houver um erro de ortografia gordura dedos, como 'cmpany, Inc.' é mesmo possível para retornar registros como esse na lista? Se é absolutamente não é possível, eu vou lidar com o que tenho. Ele só faz com que mais trabalho, mais tarde, se os registros precisam ser fundidos devido a duplicações.

Foi útil?

Solução

As especificidades dos quais algoritmo vai funcionar melhor para você depende muito de seu domínio, então eu sugiro experimentar com alguns diferentes - você pode até mesmo necessidade de combinar um pouco para obter os melhores resultados. Abreviaturas, especialmente aqueles específicos de domínio, pode precisar de ser pré-processados ??ou padronizado também.

Para os nomes, você provavelmente estaria melhor fora com um fonética algoritmo - que leva em conta pronúncia. Estes irão marcar Smith e Schmidt juntos, como eles são fáceis de confundir quando dizendo as palavras. Duplo Metaphone é uma boa primeira escolha.

Para dedilhado gordura, você provavelmente estaria melhor fora com um href="http://en.wikipedia.org/wiki/Edit_distance" rel="nofollow noreferrer"> algoritmo distância

T-SQL tem SOUNDEX e DIFERENÇA - mas eles são muito pobre. A Levenshtein variante é a escolha canônica, mas há outras opções boas - a maioria dos quais são bastante fáceis a implementar em C #, se você não consegue encontrar uma implementação devidamente licenciado.

Todos estes vão ser muito mais fácil de código / uso de C # de T-SQL (embora eu achei metaphone casal em um abuso horrendo de T-SQL que podem trabalhar em SQL).

Embora este exemplo é no Access (e eu nunca realmente olhou para o código, ou usado a implementação) a apresentação incluiu dá uma boa idéia do que você provavelmente vai acabar precisando fazer. O código é provavelmente olhar uma pena, e talvez uma porta de VBA.

Outras dicas

SOUNDEXing dentro do SQL Server. Eu acredito que ele vai te dar a imprecisão das partidas prováveis ??que você está procurando.

SOUNDEX @ MSDN

SOUNDEX @ Wikipedia

Se é possível integrar Lucene.NET em seu solutionm você deve definitivamente experimentá-lo a.

Você pode tentar usar Full Text Search com funções FREETEXT (ou FREETEXTTABLE) para tentar encontrar possíveis correspondências.

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