sql >> Database teknologi >  >> RDS >> Sqlserver

T-SQL lagret procedure for at returnere google stil foreslåede søgeresultater

Jeg vil foreslå fuldtekstsøgning (MS' eller Lucene vil fungere) Koden nedenfor bruger MSSQL FTS som det, jeg bruger i min app i øjeblikket.

Installer FTS Search, hvis du ikke allerede har gjort det. Hvis du har tjekket, at tjenesten kører. Kør dette i ledelsesstudiet for at opsætte et katalog og tilføje produkttabellen; og farve / navn / produktnummer til kataloget.

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

Du kan derefter køre forespørgsler mod alle kolonner på én gang; for eksempel. Sølv (valgt i farve og navn)

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

* på forespørgslen vil finde Silver*, så du kan bruge dette til at opbygge resultater, efterhånden som brugeren indtaster. En ting at overveje er, at google får dette til at virke i realtid - hvis du søger en masse data, kan du for at få dataene tilbage uden at afbryde indtastningen af ​​brugeren. Jeg tror generelt, at folk bruger disse søgninger ved at skrive fra det første bogstav, de leder efter - jeg accepterer, at der vil være stavefejl - du kan implementere en stavekontrol efter hvert mellemrum, de trykker på, måske for at håndtere det. Eller gem de søgninger, der udføres, og se på stavefejlene, og skift koden til at håndtere den baseret på en kortlægning (eller i FTS ved hjælp af en brugerdefineret synonymordbog.)

Ranking vil være et sjovt udviklingsproblem for enhver virksomhed; finder du det første resultat for Mountain Frame - eller vil du vægte dem efter salg eller pris? Hvis brugeren indtaster mere end én tekstterm, kan du bruge FTS til at lave en rangering baseret på søgestrengen.

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

Dette returnerer 30 rækker; og vægte baseret på den brugerinputtede tekst for at bestemme førstepladsposten. I begge tilfælde vil du sandsynligvis ønske at tilføje en kodet rangering for at tilpasse resultaterne, så de passer til dine forretningsønsker - rangering af den højest prissatte widget 1 er måske ikke måden. Det er derfor, du vil gemme, hvad folk søgte efter / klikkede på, så du kan analysere resultaterne senere.

Der er en rigtig fin sprogparser for .Net, der oversætter en google-stilstreng-forespørgsel indlæst til FTS-baseret sprog, som giver kendskab til alle booleske søgninger, der bruger dit websted.

Du vil måske også tilføje nogle visdom of crowds-funktioner ved at auditere i forhold til, hvad brugerne har input og i sidste ende besøgt og bruge succeskort til at ændre de endelige forslag for rent faktisk at gøre dem relevante for brugeren.

Som et sidste forslag, hvis dette er en kommerciel hjemmeside, vil du måske se på Easyask hvilket er en skræmmende fantastisk naturlig sprogprocessor



  1. Sådan gemmer du Emoji-karakterer i MySQL-databasen

  2. Filtype Tjek for JPG'er, JPEG, PNG'er

  3. LINQPad og Oracle

  4. Hvad er @@TEXTSIZE i SQL Server?