网络编程
位置:首页>> 网络编程>> 数据库>> 使用Microsoft SQL Server 2000全文搜索功能构建Web搜索应用程序(4)

使用Microsoft SQL Server 2000全文搜索功能构建Web搜索应用程序(4)

  发布时间:2008-09-29 12:32:00 

标签:SQL,Server,2000,全文,检索,搜索,数据库

附录B:使用最佳选择、结果分页和有效全文查询逻辑的示例应用程序

    在本例中,我们实现了一个几乎利用了本文介绍的所有优化方案的Web搜索应用程序。我们对联机零售商目录使用简单的搜索引擎方案,并假定在通信量很高的情况下,所有用户都期待在很短的响应时间内获得结果。本示例使用了前一节中的最佳选择表和存储过程。

    此应用程序只是一些可用于实现最佳全文搜索性能的高级策略的简单示例。本示例使用了ASP,也可使用ISAPI、ASP.NET或其他平台来实现具有各自优缺点的类似解决方案。会话对象并不一定对所有应用程序都适用,如果使用不当,可能带来一定程度的危险。在本例中,我们使用会话对象来实现快速有效的缓存机制—当然还有许多其他方法可以在不同程度上实现该功能。

    下面是ASP页的通用代码:

<% 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 = 0
end if

'设置常量
pageSize = 24
firstRow = 0
lastRow = 23
connectionString = <在此输入您的连接字符串>

'----------------------------------------------------------------'
'显示与最佳选择/搜索词匹配的简单主键/排位'
'----------------------------------------------------------------'
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

'否则,获取行(如果有)
if not(rs.EOF) then
alldata = rs.GetRows
Session("results") = alldata
end if

call ConnClose

else '从缓存加载(usecache=1)

alldata = Session("results")

'在此获取要使用的行范围
if (request.Form("firstRow") <> "") then
firstRow = request.Form("firstRow")
lastRow = firstRow+pageSize
elseif (request.QueryString("firstRow") <> "") then
firstRow = request.QueryString("firstRow")
lastRow = firstRow+pageSize
end if

end if ' useCache<>TRUE

'对于本应用程序,只是打印出所有最佳选择
'(可能比页面大小大),然后分页显示普通结果
'此处假设:在使用缓存时,如果没有新的最佳选择,
'则使用以前显示的最佳选择
if not(IsEmpty(bbdata)) then
response.Write("最佳选择:" & VbCrLf)
for p = 0 to ubound(bbdata, 2)
response.Write(bbData(0,p) & " " & bbData(1,p) & VbCrLf)
next
response.Write(VbCrLf)
end if

'返回搜索结果(可能只有最佳选择)
if not(IsEmpty(alldata)) then
if uBound(alldata, 2) < lastRow then
lastRow = uBound(allData, 2)
end if

response.Write("搜索结果:" & VbCrLf)

for p = firstRow to lastRow
response.Write(allData(0,p) & " " & allData(1,p) & VbCrLf)
next
end if ' not(IsEmpty(alldata))

End Sub

'----------------------------------------------------------------'
'关闭并清除连接对象 '
'----------------------------------------------------------------'
Private Sub ConnClose
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
End Sub

call SearchNPage

%>

----------------测试结束----------------

<form action="<this page>" method="post">
<input type=submit value="next <%=pageSize%> rows" NAME="Submit1">
<input type=hidden name="useCache" value="1">
<input type=hidden name="firstRow" value=<%=lastrow+1%>>
</form>

</pre>
</body>
</html>


    一个简单的HTML窗体页面即可像下面一样利用上面的脚本:

<html>
<head><title>输入搜索词</title>
</head>

<body>

<form action="<搜索ASP页面>" method="post">
搜索词:<input name="searchTerm">
<p>
<input type="submit" value="Search">
</form>
</body>
</html>

正如以上两个代码示例所示,创建可执行有效全文查询(用最佳选择完成)并缓存和分页显示结果的Web应用程序,并不需要花费太多的工夫。只需使用最低的系统开销,即可添加用于提供其他数据、增强最佳选择的外观以及在搜索结果中导航的逻辑(此外,强烈建议您实现其他用于错误处理、安全设置和清理传入数据的严密逻辑)。

    通过上面的高级建议和示例,使用SQL Server 2000全文搜索设计和实现快速可缩放的Web搜索应用程序就是轻而易举的事情了。
附录C:资源

    Full-Text Search Deployment——是那些初次接触全文搜索的用户的最佳参考。介绍了填充方法及硬件和软件需求,并为使用SQL Server 2000全文搜索提供了提示、技巧和其他文档。

    全文搜索公共新闻组(microsoft.public.sqlserver.fulltext)

    查找有关全文搜索问题的答案以及有用提示和技巧的理想场所。全文搜索新闻组是SQL Server开发小组和博学的Microsoft MVP成员经常光顾的场所。

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com