T-SQL存储过程返回谷歌样式"建议"的搜索结果

ste*_*776 7 sql t-sql sql-server sql-server-2008

好吧,使用SQL Server 2008.在我的网页上,我有一个文本框,其中连接了jQuery-UI AutoComplete.

现在我需要一个存储过程来搜索单个表的所有列(或者我猜想的多个连接表),以查找来自文本框/自动完成AJAX调用的搜索字符串,并返回"建议的"搜索字符串.我正在使用AdventureWorks数据库进行测试(产品表)

因此,例如,产品表包含产品名称和产品编号(以及其他)的列,我想根据用户输入返回建议的搜索字符串,他们可以在其中输入产品名称和/或产品编号.

我让它在一个简单的专栏中工作.有任何想法吗?

u07*_*7ch 6

我将建议全文搜索(MS'或Lucene将工作)下面的代码使用MSSQL FTS作为我目前在我的应用程序中使用的.

如果您还没有安装FTS搜索.如果您已检查该服务是否正在运行.在管理工作室运行此操作以设置目录并添加产品表; 和目录中的颜色/名称/产品编号.

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
Run Code Online (Sandbox Code Playgroud)

然后,您可以立即对所有列运行查询; 例如银(选择颜色和名称)

Select * from production.product where
contains(*, '"Silver*"')
Run Code Online (Sandbox Code Playgroud)

查询上的*将找到Silver*,因此您可以使用它来构建用户输入的结果.要考虑的一件事是谷歌让这个工作实时 - 如果您正在搜索大量数据,您将能够在不中断用户输入的情况下获取数据.我认为一般人们通过从他们正在寻找的第一个字母输入来使用这些搜索 - 我接受会有拼写错误 - 你可以在他们按下的每个空格之后实施一个拼写检查器来处理它.或者存储运行的搜索并查看错误拼写并更改代码以根据映射(或使用自定义同义词库在FTS中)处理该错误.

对任何企业而言,排名都是一个有趣的发展问题; 你是否找到Mountain Frame的第一个结果 - 或者你想按销售额或价格来衡量它们吗?如果用户键入多个文本术语,您可以使用FTS根据搜索字符串生成排名.

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
Run Code Online (Sandbox Code Playgroud)

这返回30行; 和权重基于用户输入的文本来确定第一位记录.在任何一种情况下,您可能都希望添加编码排名来调整结果以满足您的业务需求 - 排名最高价格的小部件1可能不是这样.这就是为什么你要存储人们搜索/点击的内容,以便你以后可以分析结果.

有一个非常好的.Net 语言解析器,可以将输入到FTS可用语言的谷歌样式字符串查询转换为熟悉使用您站点的任何布尔搜索.

您可能还希望通过审核用户输入的内容并最终访问并使用成功地图来更改最终建议以实际使其与用户相关,从而添加一些人群特征.

作为最终的建议,如果这是一个商业网站,你可能想看看Easyask这是一个可怕的自然语言处理器