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

Procedura memorizzata T-SQL per restituire i risultati di ricerca suggeriti in stile google

Suggerirò la ricerca full-text (MS' o Lucene funzioneranno). Il codice seguente usa MSSQL FTS come quello che uso nella mia app al momento.

Installa FTS Search se non l'hai già fatto. Se hai verificato che il servizio sia in esecuzione. In Management Studio esegui questo per impostare un catalogo e aggiungere la tabella dei prodotti; e Colore/Nome/Numero prodotto al catalogo.

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

È quindi possibile eseguire query su tutte le colonne contemporaneamente; per esempio. Argento (scelto come colore e nome)

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

Il * sulla query troverà Silver*, quindi puoi usarlo per creare risultati mentre l'utente digita. Una cosa da considerare è che Google lo fa funzionare in tempo reale:se stai cercando molti dati puoi essere in grado di per recuperare i dati senza interrompere la digitazione dell'utente. Penso che generalmente le persone utilizzino queste ricerche digitando dalla prima lettera che stanno cercando - accetto che ci saranno errori di ortografia - potresti implementare un correttore ortografico dopo ogni spazio che preme forse per gestirlo. Oppure archivia le ricerche eseguite ed esamina gli errori di ortografia e modifica il codice per gestirli in base a una mappatura (o in FTS utilizzando un thesaurus personalizzato.)

La classifica sarà un problema di sviluppo divertente per qualsiasi azienda; stai trovando il primo risultato per Mountain Frame o vuoi pesarli in base alle vendite o al prezzo? Se l'utente digita più di un termine di testo è possibile utilizzare FTS per produrre una classifica basata sulla stringa di ricerca.

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

Questo restituisce 30 righe; e pesi in base al testo immesso dall'utente per determinare il record del primo posto. In entrambi i casi, probabilmente vorrai aggiungere una classifica codificata per modificare i risultati in base ai tuoi desideri aziendali:la classifica del widget 1 con il prezzo più alto potrebbe non essere la strada giusta. Ecco perché memorizzerai ciò che le persone hanno cercato/su cui hanno fatto clic in modo da poter analizzare i risultati in un secondo momento.

C'è un parser di lingua davvero carino per .Net che traduce una query di stringa in stile google immessa in un linguaggio compatibile con FTS che fornisce familiarità per qualsiasi ricerca booleana che utilizza il tuo sito.

Potresti anche voler aggiungere un po' di saggezza sulle funzionalità della folla controllando ciò che gli utenti hanno inserito e alla fine sono andati a visitare e utilizzare le mappe di successo per modificare i suggerimenti finali per renderli effettivamente pertinenti per l'utente.

Come ultimo suggerimento, se si tratta di un sito Web commerciale, potresti voler dare un'occhiata a Easyask che è un grande processore di linguaggio naturale spaventoso