sql >> Databasteknik >  >> RDS >> Sqlserver

T-SQL lagrad procedur för att returnera google stil föreslagna sökresultat

Jag kommer att föreslå fulltextsökning (MS eller Lucene kommer att fungera) Koden nedan använder MSSQL FTS som det jag använder i min app för tillfället.

Installera FTS Search om du inte redan har gjort det. Om du har kontrollera att tjänsten körs. I management studio kör detta för att ställa in en katalog och lägga till produkttabellen; och färg / namn / produktnummer till katalogen.

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 sedan köra frågor mot alla kolumner samtidigt; t.ex. Silver (valt i färg och namn)

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

* på frågan kommer att hitta Silver* så att du kan använda detta för att bygga upp resultat när användaren skriver in. En sak att tänka på är att google får detta att fungera i realtid - om du söker mycket data kan du för att få tillbaka data utan att avbryta skrivningen av användaren. Jag tror att folk vanligtvis använder dessa sökningar genom att skriva från den första bokstaven de letar efter - jag accepterar att det kommer att finnas stavfel - du kan implementera en stavningskontroll efter varje mellanslag de trycker på för att hantera det. Eller lagra sökningarna som körs och titta på felstavningarna och ändra koden för att hantera det baserat på en mappning (eller i FTS med en anpassad synonymordbok.)

Ranking kommer att bli en rolig utvecklingsfråga för alla företag; hittar du det första resultatet för Mountain Frame -eller vill du väga dem efter försäljning eller pris? Om användaren skriver in mer än en textterm kan du använda FTS för att skapa en rankning baserat på söksträngen.

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

Detta returnerar 30 rader; och vikter baserade på användarens inmatade text för att bestämma förstaplatsposten. I båda fallen kommer du sannolikt att vilja lägga till en kodad rankning för att justera resultaten så att de passar dina affärsönskemål - rangordning av den mest prisvärda widgeten 1 kanske inte är rätt sätt. Det är därför du kommer att lagra vad folk sökte efter / klickade på så att du kan analysera resultaten senare.

Det finns en riktigt trevlig språkparser för .Net som översätter en strängfråga i google-stil inmatad till ett FTS-kompatibelt språk som ger förtrogenhet med alla booleska sökningar som använder din webbplats.

Du kanske också vill lägga till några visdom of crowds-funktioner genom att granska vad användarna har input och slutligen besökt och använda framgångskartor för att ändra de slutliga förslagen för att faktiskt göra dem relevanta för användaren.

Som ett sista förslag om detta är en kommersiell webbplats kanske du vill titta på Easyask vilket är en skrämmande fantastisk naturlig språkprocessor



  1. Kan en främmande nyckel fungera som en primärnyckel?

  2. MySQL diakritisk okänslig sökning (arabiska)

  3. Händer det någon automatisk commit efter att ha kört lagrade procedurer i Oracle?

  4. Hur man aktiverar SSL i PostgreSQL