OK, à l'aide de SQL Server 2008. Sur ma page Web, j'ai une zone de texte avec jQuery-ui autocomplete accroché. P>
Maintenant, j'ai besoin d'une procédure stockée pour rechercher dans toutes les colonnes d'une table unique (ou plusieurs tables jointes que je suppose) pour une chaîne de recherche provenant de l'appel de TextBox / Autocomplete Ajax et renvoyez les chaînes de recherche "suggérées". J'utilise l'aventureWorks DB pour tester (table de produits) P>
Ainsi, par exemple, la table de produit contient des colonnes pour le nom de produit et le numéro de produit (entre autres) et je souhaite renvoyer des chaînes de recherche suggérées basées sur l'entrée de l'utilisateur où elles peuvent entrer un nom de produit et / ou un numéro de produit. p>
Je l'ai travaillé sur une seule colonne qui était simple. Des idées? P>
4 Réponses :
Edit: Utilisez un Union pour rejoindre des requêtes distinctes
SELECT productname FROM foo WHERE productname LIKE '%myinput%' UNION SELECT productnumber FROM foo WHERE productnumber LIKE '%myinput%' UNION ...
Mais qu'en est-il de la déclaration SELECT? Je souhaite effectuer une recherche sur toutes les colonnes de la table / des tables et de renvoyer une seule colonne de valeurs correspondantes.
@Paul Sasik: Ma première réponse n'a pas été pensée à travers ...?
J'ai vu votre première itération. C'était sur la marque ou au moins sur le chemin. Certainement pas la bownvote-digne d'imo.
Cela semble être la méthode la plus simple. J'ai vu mention de la distance d'édition de Levenshtein, mais je ne peux pas envelopper ma tête autour de la manière de l'utiliser dans ce cas
N'était pas moi qui a bownvoted ... je n'ai pas assez de représentant à le faire lol et je suis d'accord ... pas de bowtvote-digne
Stephen: Je déjoue mon message depuis que vous avez montré un intérêt pour ma solution. C'est un algorithme complexe mais peut être utilisé très simplement. Voir mon édition que je vais baser sur le SQL de GBN ...
Townvoted comme «% A%» ou comme '% B%' est un billet aller simple pour des performances terribles. La solution syndicale est meilleure. SQL peut lire plus d'une colonne - si vous activez la recherche de texte complète - ci-dessous.
Utilisation de Soundex fonctionner serait le moyen le plus simple de faire correspondre pour des "éléments" similaires dans plusieurs colonnes. Mais un meilleur algorithme de correspondance qui sera presque aussi rapide à mettre en œuvre est le Levenshtein Edit Distance . Voici le implémentation T-SQL enveloppée dans une fonction. Utilisez-le pour correspondre à des termes de recherche similaires.
Supposons que votre fonction LEVENSHTEIN T-SQL LVN (Juste Fro Brevity's Sake) Alors que vous pourriez faire quelque chose comme: p> yep. c'est simple. BTW, j'ai mis à jour le lien T-SQL Levenshtein à quelque chose qui a plus de sens, et c'est une réponse acceptée. P> P>
impressionnant! Je vais vérifier cela à coup sûr. Cela devrait être exactement ce que je cherche
Oui cela fonctionne bien. Je peux voir que cela est utile dans la situation où l'on cherche quelque chose comme des numéros de produit où il serait facile de mal de type 1 ou plus de caractères
C'est aussi bon pour la vérification orthographique et les recherches floues. Levenshtein est sans quelque chose que vous voulez mettre dans votre poche arrière. Il est incroyablement portable et utile.
@Paul Sasik - Toute recommandation pour une "limite supérieure" à passer à la fonction Levenschtein ?? Quel serait un bon équilibre entre précision et tolérance d'erreur / faute de frappe?
@Paul Sasik - J'ai aussi des problèmes de tri..je obtenir les résultats corrects mais je ne peux pas comprendre le meilleur moyen de les trier dans l'ordre le plus pertinent ... peut-être que je devrais commencer une nouvelle question pour cela ...
Eh bien, lorsque vous faites une requête Union, les noms de colonne deviennent vagues, vous devez donc commander par index, qui est basé sur 1. Donc, votre commande par va ressembler à ceci: commander par 1
Je vais suggérer que la recherche de texte intégral (MS 'ou Lucene fonctionnera) Le code ci-dessous utilise MSSQL FTS comme étant ce que j'utilise dans mon application pour le moment.
Installez FTS Search si vous n'avez pas encore . Si vous avez vérifié, le service est en cours d'exécution.
Dans Management Studio exécutez ceci pour configurer un catalogue et ajouter la table des produits; et la couleur / nom / numéro de produit au catalogue. p> Vous pouvez ensuite exécuter des requêtes contre toutes les colonnes à la fois; par exemple. Silver (choisi comme couleur et nom) p> Le * sur la requête trouvera Silver * afin que vous puissiez l'utiliser pour créer des résultats en tant que type utilisateur. Un La chose à considérer est que Google rend ce travail en temps réel - si vous recherchez beaucoup de données, vous pourrez récupérer les données sans interrompre la saisie de l'utilisateur. Je pense généralement que les gens utilisent ces recherches en tapant à partir de la première lettre qu'ils recherchent - j'accepte des erreurs d'orthographe - vous pouvez implémenter un vérificateur orthographique après chaque espace qu'ils appuient peut-être à gérer cela. Ou stocker les recherches exécutées et regarder les distinctions et modifier le code pour gérer celui basé sur une cartographie (ou en FTS à l'aide d'un thésaurus personnalisé.) P> Le classement sera un problème de développement amusant pour toute entreprise; Vous trouvez-vous le premier résultat pour montagne -or-or-or de montagne voulez-vous les pondérer en ventes ou à prix? Si l'utilisateur Type de plus d'un terme texte, vous pouvez utiliser FTS pour produire un classement basé sur la chaîne de recherche. p> Ceci renvoie 30 rangées; et des poids basés sur le texte entré par l'utilisateur pour déterminer le premier enregistrement. Dans les deux cas, vous voudrez probablement ajouter un classement codé pour modifier les résultats en fonction de vos désirs de votre entreprise - le classement du widget au prix le plus élevé 1 pourrait ne pas être la voie. C'est pourquoi vous allez stocker ce que les personnes recherchées / cliquées sur afin que vous puissiez analyser les résultats ultérieurement. P> Il y a un très sympa Parser de langue pour .NET qui traduit une requête de chaîne de style Google entrée en langage FTS'able qui donne la familiarité pour toutes les recherches booléennes qui utilisent votre site. P> Vous voudrez peut-être aussi ajouter de la sagesse des caractéristiques de la foule en audit des utilisateurs des utilisateurs et finalement disparu pour visiter et utiliser les cartes de réussite pour modifier les suggestions finales pour les rendre pertinents pour l'utilisateur. p> En tant que suggestion finale Si tel est un site Web commercial, vous voudrez peut-être consulter easyask qui est un excellent processeur de langage naturel effrayant p> p>
Je vais certainement garder cela à l'esprit. Merci pour le grand exemple
Après une lecture ultérieure et une autre question posée..Ce peut s'avérer une meilleure solution ... la regarder plus maintenant. Merci encore
J'ai créé un exemple SQL qui retournera le résultat de la recherche de style Google. Vous pouvez essayer ce T-SQL. Vous pouvez également ajouter plus d'un critère de recherche de colonne de table.
ALTER PROC [dbo].[USP_GetDoctorLookupList] ( @SearchText varchar(50), @ItemCount int ) AS BEGIN SET @SearchText = RTRIM(@SearchText) + '%' BEGIN SELECT TOP (@ItemCount) * FROM ( SELECT CASE WHEN RTRIM(LTRIM(d.cdocname)) LIKE @SearchText then 1 WHEN RTRIM(LTRIM(d.cdeano)) LIKE @SearchText then 2 END OrderBy, d.docid_PK, d.cdocname, d.cdeano FROM doctor d WHERE (d.cdocname LIKE @SearchText OR d.cdeano LIKE @SearchText ) ) Doc ORDER BY OrderBy, cdocname END END
Merci à tous pour tous les grands commentaires et exemples. Ils ont tous leurs utilisations dans diverses situations et je peux me voir en utilisant une forme de tous dans le futur