关 键 词:
搜索 Microsoft
select [key], [rank] from freetexttable(bestBets, keywords, @searchTerm) order by [rank] desc
确保已对传入搜索字符串进行清理,以避免在服务器上随意执行 T-SQL,并确保用单引号将该字符串括起。这种情况下,使用 FREETEXTTABLE 比使用 CONTAINSTABLE 要好,因为 FREETEXTTABLE 将采用寻根溯源功能,并找到与任何搜索词相匹配的最佳选择。接下来,第二个存储过程检索与常规搜索标准匹配的文档(如果有):create procedure FTSearch @searchTerm varchar(1024) as
select [key], [rank] from freetexttable(documentTable, keywords, @searchTerm) order by [rank] desc
此外,请确保已清理传入搜索字符串,并用单引号将该字符串括起。执行这些存储过程时,应该在两个存储过程中传入相同的搜索词,首先执行最佳选择搜索,然后执行普通全文搜索。下一节更全面地介绍了在构建 Web 搜索应用程序时,如何与其他全文搜索技术一起使用最佳选择。附录 B:使用最佳选择、结果分页和有效全文查询逻辑的示例应用程序在本例中,我们实现了一个几乎利用了本文介绍的所有优化方案的 Web 搜索应用程序。我们对联机零售商目录使用简单的搜索引擎方案,并假定在通信量很高的情况下,所有用户都期待在很短的响应时间内获得结果。本示例使用了前一节中的最佳选择表和存储过程。此应用程序只是一些可用于实现最佳全文搜索性能的高级策略的简单示例。本示例使用了 asp,也可使用 ISAPI、asp.net 或其他平台来实现具有各自优缺点的类似解决方案。会话对象并不一定对所有应用程序都适用,如果使用不当,可能带来一定程度的危险。在本例中,我们使用会话对象来实现快速有效的缓存机制 - 当然还有许多其他方法可以在不同程度上实现该功能。下面是 ASP 页的通用代码:<% @Language = \"vbScript\" %><% Response.buffer = true %><html> <head> <title>FT 测试</title></head> <body><pre>----------------- 开始测试 ------------------
<%
Dim firstRow @# 分页显示行时的第一行Dim lastRow @# 分页显示行时的最后一行Dim pageSize @# 页面大小(每次的行数)Dim cn @# 连接对象Dim rs @# FT 主键/排位返回的结果集(重复使用)Dim useCache @# 使用缓存或命中 FT(0:不使用;1:使用)Dim alldata @# 要缓存的结果行集合Dim bbdata @# 要缓存的最佳选择行集合Dim connectionString @# SQL 连接字符串
@# 确定是否要从缓存获取数据@# 默认为否,否则接受传入的数据if (request.Form(\"useCache\") <> \"\") then useCache = request.Form(\"useCache\")elseif (request.QueryString(\"useCache\") <> \"\") then useCache = request.QueryString(\"useCache\")else useCache = 0end if
@# 设置常量pageSize = 24firstRow = 0lastRow = 23connectionString = <在此输入您的连接字符串>
@#----------------------------------------------------------------@#@# 显示与最佳选择/搜索词匹配的简单主键/排位 @#@#----------------------------------------------------------------@#Private Sub SearchNPage()
Dim p @# 循环通过行时的计数器 Dim numRows @# 缓冲/结果集中的总行数
if (useCache <> \"1\") then @# 获取最佳选择/结果并将其缓存
Dim queryArg @# 传入的查询词 if (request.Form(\"searchTerm\") <> \"\") then queryArg = request.Form(\"searchTerm\") elseif (request.QueryString(\"searchTerm\") <> \"\") then queryArg = request.QueryString(\"searchTerm\") else response.Write(\"未提供搜索词\" & VbCrLF) exit sub end if
@# 理想情况下,应该在此清理查询词... @# 添加自定义的清理逻辑,以防止 @# 随意执行 SQL
@# 调用 CleanString(queryArg)
@# 建立与 SQL 的连接 Set cn = Server.CreateObject(\"ADODB.Connection\") cn.Open connectionString
@# 从传入的干净字符串中获取最佳选择匹配项 set rs = cn.Execute(\"exec BBSearch @#\" & queryArg & \"@#\")
@# 如果有最佳选择,则获取最佳选择 if not(rs.EOF) then bbData = rs.GetRows end if
@# 现在从传入的干净字符串中获取普通匹配项 set rs = cn.Execute(\"exec FTSearch @#\" & queryArg & \"@#\")
@# 如果未返回任何结果,则结束 if (rs.EOF and IsEmpty(bbdata)) then response.Write(\"没有匹配的行\" & VbCrLF) call ConnClose exit sub end if

