Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Procédure stockée T-SQL pour renvoyer les résultats de recherche suggérés de style Google

Je vais suggérer une recherche en texte intégral (MS' ou Lucene fonctionnera) Le code ci-dessous utilise MSSQL FTS comme ce que j'utilise dans mon application pour le moment.

Installez FTS Search si vous ne l'avez pas déjà fait. Si vous avez vérifié que le service est en cours d'exécution. Dans le studio de gestion, exécutez ceci pour configurer un catalogue et ajouter la table des produits ; et Couleur / Nom / Numéro de produit au catalogue.

USE [AdventureWorks]
GO
CREATE FULLTEXT CATALOG [ProductsTest]WITH ACCENT_SENSITIVITY = OFF
AUTHORIZATION [dbo]

GO

USE [AdventureWorks]
GO
CREATE FULLTEXT INDEX ON [Production].[Product] KEY INDEX [PK_Product_ProductID] ON ([ProductsTest]) WITH (CHANGE_TRACKING AUTO)
GO
USE [AdventureWorks]
GO
ALTER FULLTEXT INDEX ON [Production].[Product] ADD ([Color])
GO
USE [AdventureWorks]
GO
ALTER FULLTEXT INDEX ON [Production].[Product] ADD ([Name])
GO
USE [AdventureWorks]
GO
ALTER FULLTEXT INDEX ON [Production].[Product] ADD ([ProductNumber])
GO
USE [AdventureWorks]
GO
ALTER FULLTEXT INDEX ON [Production].[Product] ENABLE
GO

Vous pouvez ensuite exécuter des requêtes sur toutes les colonnes à la fois ; par exemple. Argent (choisi selon sa couleur et son nom)

Select * from production.product where
contains(*, '"Silver*"')

Le * sur la requête trouvera Silver * afin que vous puissiez l'utiliser pour créer des résultats au fur et à mesure que l'utilisateur tape. Une chose à considérer est que Google fait que cela fonctionne en temps réel - si vous recherchez beaucoup de données, vous pouvez pour récupérer les données sans interrompre la saisie de l'utilisateur. Je pense que généralement les gens utilisent ces recherches en tapant à partir de la première lettre qu'ils recherchent - j'accepte qu'il y ait des fautes d'orthographe - vous pouvez implémenter un correcteur orthographique après chaque espace sur lequel ils appuient peut-être pour gérer cela. Ou stockez les recherches qui sont exécutées et examinez les fautes d'orthographe et modifiez le code pour gérer cela en fonction d'un mappage (ou dans FTS à l'aide d'un thésaurus personnalisé.)

Le classement va être un problème de développement amusant pour toute entreprise; trouvez-vous le premier résultat pour Mountain Frame - ou souhaitez-vous les pondérer en fonction des ventes ou du prix ? Si l'utilisateur saisit plus d'un terme de texte, vous pouvez utiliser FTS pour produire un classement basé sur la chaîne de recherche.

select aa.rank, bb.* 
From containstable(production.product, *, '"Mountain" and "Silver*"') aa
inner join production.product bb
on aa.[key] = bb.productid
order by rank desc

Cela renvoie 30 lignes; et des pondérations basées sur le texte entré par l'utilisateur pour déterminer l'enregistrement de première place. Dans les deux cas, vous souhaiterez probablement ajouter un classement codé pour ajuster les résultats en fonction de vos désirs commerciaux - le classement du widget 1 le plus cher n'est peut-être pas la solution. C'est pourquoi vous allez stocker ce que les gens ont recherché/cliqué afin de pouvoir analyser les résultats plus tard.

Il existe un très bon analyseur de langage pour .Net qui traduit une requête de chaîne de style Google saisie dans un langage FTS, ce qui donne une familiarité pour toutes les recherches booléennes qui utilisent votre site.

Vous pouvez également ajouter des fonctionnalités de sagesse des foules en auditant par rapport à ce que les utilisateurs ont saisi et finalement allé visiter et utiliser des cartes de réussite pour modifier les suggestions finales afin de les rendre réellement pertinentes pour l'utilisateur.

Comme dernière suggestion, s'il s'agit d'un site Web commercial, vous pouvez consulter Easyask qui est un excellent processeur de langage naturel effrayant