Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Procedimento armazenado T-SQL para retornar resultados de pesquisa sugeridos no estilo do Google


Vou sugerir pesquisa de texto completo (MS ou Lucene funcionará) O código abaixo usa MSSQL FTS como é o que eu uso no meu aplicativo no momento.

Instale o FTS Search se ainda não o fez. Se você verificou se o serviço está em execução. No estúdio de gerenciamento, execute isso para configurar um catálogo e adicionar a tabela de produtos; e Cor/Nome/Número do Produto ao 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

Você pode então executar consultas em todas as colunas de uma vez; por exemplo. Prata (escolhido como sua cor e nome)
Select * from production.product where
contains(*, '"Silver*"')

O * na consulta encontrará Silver* para que você possa usar isso para criar resultados à medida que o usuário digita. Uma coisa a considerar é que o Google faz isso funcionar em tempo real - se você estiver pesquisando muitos dados, poderá para recuperar os dados sem interromper a digitação do usuário. eu acho que geralmente as pessoas usam essas pesquisas digitando a partir da primeira letra que estão procurando - eu aceito que haverá erros de ortografia - você pode implementar um verificador ortográfico após cada espaço que eles pressionam, talvez para lidar com isso. Ou armazene as pesquisas que são executadas e observe os erros de ortografia e altere o código para lidar com isso com base em um mapeamento (ou no FTS usando um dicionário de sinônimos personalizado).

A classificação será uma questão de desenvolvimento divertida para qualquer negócio; você está encontrando o primeiro resultado para Mountain Frame - ou deseja ponderá-los por vendas ou preço? Se o usuário digitar mais de um termo de texto, você poderá usar o FTS para produzir uma classificação com base na string de pesquisa.
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

Isso retorna 30 linhas; e pesos com base no texto inserido pelo usuário para determinar o primeiro registro. Em ambos os casos, você provavelmente desejará adicionar uma classificação codificada para ajustar os resultados de acordo com seus desejos de negócios - classificar o widget 1 com o preço mais alto pode não ser o caminho. É por isso que você vai armazenar o que as pessoas pesquisaram / clicaram para poder analisar os resultados depois.

Existe um analisador de idioma muito bom para .Net que traduz uma consulta de string de estilo google inserida em linguagem FTS'able que fornece familiaridade para qualquer pesquisa booleana que use seu site.

Você também pode adicionar um pouco de sabedoria dos recursos de multidões auditando o que os usuários inseriram e, finalmente, foram visitar e usar mapas de sucesso para alterar as sugestões finais para torná-las realmente relevantes para o usuário.

Como sugestão final, se este for um site comercial, você pode dar uma olhada em Easyask que é um ótimo processador de linguagem natural assustador