现在我需要一个存储过程来搜索单个表的所有列(或者我想的多个连接表),以查找来自文本框/自动完成AJAX调用的搜索字符串,并返回“建议的”搜索字符串.我正在使用AdventureWorks数据库进行测试(产品表)
因此,例如,产品表包含产品名称和产品编号(以及其他)的列,我想根据用户输入返回建议的搜索字符串,他们可以输入产品名称和/或产品编号.
我让它在单个列上工作很简单.有任何想法吗?
解决方法
如果您还没有安装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
Select * from production.product where contains(*,'"Silver*"')
查询上的*将找到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
这返回30行;和权重基于用户输入的文本来确定第一位记录.在任何一种情况下,您可能都希望添加编码排名来调整结果以满足您的业务需求 – 排名最高价格的小部件1可能不是这样.这就是为什么你要存储人们搜索/点击的内容,以便你以后可以分析结果.
有一个非常好的.000版本.Net可以翻译输入到FTS可用语言的谷歌样式字符串查询,这使得熟悉任何使用您网站的布尔搜索.
您可能还希望通过审核用户输入的内容并最终访问并使用成功地图来更改最终建议以实际使其与用户相关,从而添加一些智慧人群功能.
作为最终的建议,如果这是一个商业网站,你可能想看看Easyask这是一个可怕的伟大的自然语言处理器