Voy a sugerir la búsqueda de texto completo (MS 'o Lucene funcionarán) El siguiente código utiliza MSSQL FTS como su uso en mi aplicación en este momento.
Instalar FTS Search si aún no lo ha hecho. Si tiene control, el servicio se está ejecutando. En el estudio de administración, ejecute esto para configurar un catálogo y agregar la tabla de productos; y Color/Nombre/Número de Producto para el 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
A continuación, puede ejecutar consultas contra todas las columnas a la vez; p.ej. Plata (elegido como en el color y nombre)
Select * from production.product where
contains(*, '"Silver*"')
El * en la consulta encontrarán plata * para que pueda usar esto para acumular resultados que el usuario escribe en. Una cosa a tener en cuenta es que Google a mejorar este trabaje en tiempo real: si está buscando una gran cantidad de datos, podrá 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 están buscando (acepto errores ortográficos). Podrían implementar un corrector ortográfico después de cada espacio que presionen para manejarlo. O almacene las búsquedas que se ejecutan y observe los errores ortográficos y cambie el código para manejarlo en función de un mapeo (o en FTS usando un diccionario de sinónimos personalizado).)
La clasificación va a ser un problema de desarrollo divertido para cualquier empresa; ¿Encontraste el primer resultado para Mountain Frame? ¿O quieres ponderarlos por ventas o por precio? Si el usuario escribe más de un término de texto, puede usar FTS para generar 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 ponderaciones basadas en el texto ingresado por el usuario para determinar el primer registro de lugar. En cualquier caso, es probable que desee agregar una clasificación codificada para modificar los resultados según sus deseos de negocios: clasificar el widget de mayor precio 1 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 adelante.
Hay un muy buen language parser para .Net que traduce una consulta de cadena de estilo de google ingresada en el lenguaje FTS, que le proporciona familiaridad para cualquier búsqueda booleana que use su sitio.
Quizás desee agregar algo de sabiduría acerca de las funciones de multitudes al auditar en contra de lo que los usuarios ingresaron y finalmente visitar y usar los mapas de éxito para alterar las sugerencias finales y hacerlas relevantes para el usuario.
Como sugerencia final si se trata de un sitio web comercial es posible que desee mirar a Easyask que es un gran procesador de lenguaje natural miedo
Gracias a todos por los buenos comentarios y ejemplos. Todos tienen sus usos en diversas situaciones y puedo verme a mí mismo usando alguna forma de todos ellos en el futuro – stephen776