sql >> Base de Datos >  >> RDS >> Sqlserver

Procedimiento almacenado T-SQL para devolver resultados de búsqueda sugeridos al estilo de Google

Voy a sugerir una búsqueda de texto completo (MS o Lucene funcionarán) El siguiente código usa MSSQL FTS como lo que uso en mi aplicación en este momento.

Instale FTS Search si aún no lo ha hecho. Si ha verificado que el servicio se está ejecutando. En Management Studio, ejecute esto para configurar un catálogo y agregar la tabla de productos; y Color/Nombre/Número de producto al catálogo.

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

Luego puede ejecutar consultas en todas las columnas a la vez; p.ej. Plata (Elegido por su color y nombre)

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

El * en la consulta encontrará Silver*, por lo que puede usar esto para generar resultados a medida que el usuario ingresa. Una cosa a considerar es que Google hace que esto funcione en tiempo real; para recuperar los datos sin interrumpir la escritura del usuario. Creo que, en general, las personas usan estas búsquedas escribiendo desde la primera letra que buscan; acepto que habrá errores ortográficos. Podría implementar un corrector ortográfico después de cada espacio que presionan, tal vez para manejar eso. O almacene las búsquedas que se ejecutan y mire los errores ortográficos y cambie el código para manejar eso en función de un mapeo (o en FTS usando un diccionario de sinónimos personalizado).

La clasificación va a ser un tema de desarrollo divertido para cualquier negocio; ¿Está encontrando el primer resultado para Mountain Frame o quiere ponderarlos por ventas o precio? Si el usuario escribe más de un término de texto, puede usar FTS para producir una clasificación basada en la cadena de búsqueda.

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

Esto devuelve 30 filas; y pesos basados ​​en el texto ingresado por el usuario para determinar el registro del primer lugar. En cualquiera de los casos, es probable que desee agregar una clasificación codificada para modificar los resultados y adaptarlos a sus deseos comerciales; clasificar el widget 1 con el precio más alto podría no ser el camino. Es por eso que va a almacenar lo que la gente buscó/hizo clic para que pueda analizar los resultados más tarde.

Hay un muy buen analizador de lenguaje para .Net que traduce una consulta de cadena de estilo de Google ingresada en un lenguaje compatible con FTS que brinda familiaridad para cualquier búsqueda booleana que use su sitio.

También es posible que desee agregar un poco de sabiduría de las funciones de multitudes al auditar lo que los usuarios han ingresado y finalmente han ido a visitar y usar mapas de éxito para modificar las sugerencias finales para que sean realmente relevantes para el usuario.

Como sugerencia final, si se trata de un sitio web comercial, puede consultar Easyask que es un gran procesador de lenguaje natural aterrador