2010-08-24 6 views
4

.NET Je me sens comme un peu d'un débutant affichage, mais de toute façon:La meilleure façon de comparer des chaînes complexes dans SQL ou

J'ai un grand nombre de pièces, 3000-5000 qui ont des noms complexes, à base sur celui qui est entré dans les éléments sur une période de 16 ans, et l'exemple d'un nom est:

"Food, Dog, Pal Meaty Bites chunks 8kg bag" 

un autre, point connexe est nommé:

"DOG FOOD: Meaty Bites (Pal) 22kg bag" 

Le problème est que j'ai des listes d'articles d'un certain nombre de fournisseurs, avec des prix actualisés, que je dois adapter à notre liste de stock existante. La première fois que je reçois une liste, je veux essayer de faire une recherche de «correspondance la plus proche» et présenter à l'utilisateur une liste de nos noms d'articles courants, qui pourraient correspondre au nom de l'article en stock du fournisseur. L'utilisateur choisira alors le bon SKU et l'application importera l'article du fournisseur et le lien vers notre tableau de stock PK.

Le nom du fournisseur variera également. Un exemple est:

"Pal Meaty Bites Chunks 8kg" 

Je peux faire la correspondance en SQL ou .NET, ce que vous recommandez. Je souhaite présenter l'utilisateur avec le moins d'éléments possible en fonction du plus grand nombre de mots clés disponibles. Mes idées sont les suivantes:

Dans .Net: diviser en tableau et rechercher chaque mot-clé pour chaque élément (lent) En SQL: utiliser un index de texte intégral et diviser le nom en mots-clés en utilisant "OU" liste de retour sur rang avec coupure

Cela doit être un scénario commun, je ne suis pas sûr de la meilleure façon de le faire. Merci pour votre contribution!

Editer: Ajout d'un contexte: Nous avons une table SKU qui a environ 20 champs, y compris StockKeepingUnitID, qui est l'unique PK (int identité). Les produits des fournisseurs sont extraits dans une table appelée StockOrderUnit, qui a un FK de SupplierID et StockKeepingUnitID, et possède un champ appelé SupplierCode (varchar) qui contient le code unique du fournisseur pour cet article en stock. Le problème est que de nombreux fournisseurs nous envoient des listes de prix et qu'il appartient à un utilisateur de faire correspondre les articles du fournisseur (qui sont inconnus à ce stade) avec les références déjà existantes dans la base de données. Une fois qu'ils en ont sélectionné un, les enregistrements sont joints.

+0

Quelle version de SQL Server? Si SQL 2008 les mots indexés en texte intégral sont assez facilement disponibles pour interroger. –

Répondre

3

Retardez-le définitivement sur le code client plutôt que sur la base de données. Cela vous permettra, comme vous le dites, de créer un score des correspondances, et de permettre à l'utilisateur de choisir/confirmer vos correspondances automatisées. Je l'aborderais en le divisant en un tableau, en le convertissant en minuscule, puis en le triant par ordre alphabétique. Essayez peut-être de déplacer les termes avec des nombres à l'avant du tableau. Tirez le tout dans une chaîne pour aider l'utilisateur à reconnaître les correspondances avec un peu de cohérence.

Je n'hésiterais pas à le faire de manière automatisée, et sans la supervision de l'utilisateur, dans un script SQL. Peut-être que les utilisateurs pourraient recevoir un score, et seulement juger ceux qui sont sous un certain seuil.

+0

Merci. C'est ce que j'avais conclu. Il ne serait pas complètement automatisé, il suffit de dresser une liste de 5 à 10 meilleurs résultats pour un utilisateur. S'ils doivent chercher, ils ne le feront pas! La raison pour laquelle je repensais à SQL est de tirer parti de l'index de texte intégral, mais je devrais encore nettoyer les résultats dans .NEt de toute façon je suppose. Merci pour votre réponse. – Molloch

1

Vous pouvez utiliser le mot-clé SQL LIKE pour effectuer des recherches de ce type.

select fld1, fld2 from ProductTable where fld1 LIKE '%Meaty Bites%'; 

Pardonnez-moi si vous en avez déjà un, mais si vous ne possédez pas de SKU (Stock Keeping Unit) Système pour l'amour de l'humanité en créer un.Créez au minimum une clé primaire unique qui s'incrémente automatiquement (identité) et l'applique à tous vos enregistrements. Utilisez cette option pour effectuer des recherches, etc.

Si vous utilisez 'like', vous obtiendrez beaucoup moins d'enregistrements et vous n'aurez pas besoin d'écrire beaucoup de code pour faire le travail.

+0

Merci. J'étais juste bref pour l'amour du poste. Nous avons une table SKU qui compte environ 20 champs, y compris StockKeepingUnitID, qui est l'identité PK int unique. Les produits fournisseurs sont extraits dans une table appelée StockOrderUnit, qui contient un FK de SupplierID et StockKeepingUnitID, et possède un champ appelé SupplierCode (varchar) qui contient le code unique du fournisseur pour cet article en stock. Le problème est que de nombreux fournisseurs nous envoient des listes de prix et qu'il appartient à l'utilisateur de faire correspondre les articles du fournisseur (qui sont inconnus à ce stade) avec les références existantes de la base de données. – Molloch

+0

@Molloch Gotcha '. Continuez à combattre le bon combat. :-) Rappelez-vous "like" renvoie un ensemble de résultats pas seulement un seul enregistrement. – JustBoo

1

Vous pourriez prendre vos deux approches.
Diviser et effectuer une correspondance de base dans SQL.
Puis score les résultats dans .Net

Votre appariement de base dans SQL pourrait être aussi simple qu'une grande liste de toutes les choses qui correspondent à un certain nombre de mots.

Ensuite, votre score dans .Net est où la vraie «magie» se produirait.

Questions connexes