使用Microsoft SQL Server 2000全文搜索功能构建Web搜索应用程序(4)
发布时间:2008-09-29 12:32:00
附录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成员经常光顾的场所。


猜你喜欢
- 于断电或非正常关机而导致MySQL(和PHP搭配之最佳组合)数据库出现错误是非常常见的问题。有两种方法,一种方法使用MySQL(和PHP搭配
- python中字典的key不能是可变类型。字典可存储任意类型对象,其中值可以取任何数据类型,但键必须是不可变的,如字符串、数字或元组。语法格
- 最近在工作当中遇到一个问题 有个页面需要添加一个浏览历史记录功能具体来说就是要记录下用户在此网站的点击历史 并把它们降序排列出来(只显示前6
- 今天遇到一个问题,在同事随意的提示下,用了 itertools.groupby 这个函数。不过这个东西最终还是没用上。问题就是对一个list
- python中查找指定的字符串的方法如下:code#查询def selStr(): sStr1 = 'jsjtt.com
- 统计每个库每个表的大小是数据治理的其中最简单的一个要求,本文将从抽样统计结果及精确统计结果两方面来统计MySQL的每个库每个表的数据量情况。
- Python(包括其包Numpy)中包含了了许多概率算法,包括基础的随机采样以及许多经典的概率分布生成。我们这个系列介绍几个在机
- 前段时间公司数据库服务器崩溃启动不起来,经过我初步排查是/home目录挂载不上导致启动不起来,虽然通过注释/etc/fstab中的挂载信息,
- show.php源代码: <? if ($action=="cp"){ echo"<div ali
- 本文章来为各位介绍一个python的例子,这个就是bootstrap+flask写登录页面的例子,希望文章能够对各位有所帮助。Flask是一
- SQL Server中新增加了XML.Modify()方法,分别为xml.modify(insert),xml.modify(delete)
- 需求有多个文件地理数据库(gdb),数据库内有多个面要素类图层,每个图层不能有自重叠,也不能和其他图层重叠。所以,需要为每个文件地理数据库(
- 可以用作一些资源的释放。1.在一个函数内的defer执行顺序是先写的后执行,后写的先执行(遵循栈结构)func DeferTest1(){
- 本文实例讲述了JS仿Windows开机启动Loading进度条的方法。分享给大家供大家参考。具体实现方法如下:<html><
- 你是否对获得MySQL改变字符集的实际操作感到十分头疼?不用急,以下的文章将会给你正确的解答方案,以下的文章主要是介绍获得MySQL改变字符
- python DataFrame的合并方法Python的Pandas针对DataFrame,Series提供了多个合并函数,通过参数的调整可
- 常用配置以下配置能使用File -> New Projects Settings -> Settings for New Pro
- 二元运算二元运算是指由两个元素形成第三个元素的一种规则,例如数的加法及乘法;更一般地,由两个集合形成第三个集合的产生方法或构成规则称为二次运
- 实例如下:#coding=utf-8import subprocessfrom time import *import win32apiim
- 查看并打印matplotlib中所有的colormap(cmap)类型代码如下:方法一import matplotlib.pyplot as