用MSSQL Server建立Internet上的全文检索系统
本文提供了一种在MSSQL Server7上实现的基于模式匹配的全文检索算法,并使用此算法,通过ASP建立了一个完整、实用的Internet上的全文检索系统。
利用MSSQL Server7开发Internet上的全文检索系统,有两种方法:
利用数据库本身提供的专门全文检索机制;
以模式匹配为基础,自行开发相应检索算法。
比较而言,MSSQL Server7中的专门全文检索功能管理复杂,限制较多,如使用前必须预先建立全文索引,而且仅限于VARCHAR和TEXT类型的字段,而基于模式匹配的全文检索功能使用简单,适用数据类型广,在数据记录不是很大的情况下,查询效率也较快,非常适合中小规模的数据库。
下面的Internet检索系统由使用ASP构造的基于模式匹配的全文检索算法实现。该检索系统使用Windows NT下的IIS3.0为Web服务器,以MSSQL Server为后台数据库。在几十万条记录的数据库中,通过大量测试和实用,证明该检索系统响应迅速,实用有效。
该检索系统中,用户可在浏览器上,通过给定的录入窗口,输入任意短语或关键词,不同的短语或关键词之间可以进行“与”、“或”、“非” 三种逻辑运算,检索算法中采用任意字符模糊匹配方式在既定的一个或多个字段上,进行全文检索。
系统由四个文件组成:
CX.HTM为用户提供查询界面;
S1.ASP提供查询功能;
S2.ASP、LINK.ASP显示页面。
其中使用的数据库名为mmm_lib,表名为sc_jcml。
//CX.HTM
< !DOCTYPE HTML PUBLIC
“-//W3C//DTD HTML 4.0 Transitional//EN" >
< HTML >< HEAD >< TITLE >cx< /TITLE >
< META content=“text/html;
charset=gb2312" http-equiv=content-type >
< META content=“Microsoft FrontPage 4.0"
name=GENERATOR >
< SCRIPT LANGUAGE=“javascript" >
< !--
function Check() ‘提供用户端的输入检查
{
var str=document.form.S.value
if(str==“")
{
alert(“!!!查询字符串不得为空!!!");
document.form.S.focus();
return false;
}
return true;
}
-- >
< /script >
< /HEAD >
< BODY >
< CENTER >
< br >< b >< font color=“#006F6F" size=“4" >
录像目录查询系统< /font >< /b >
< br >< br >
< hr color=“#008080" >
< FORM action=search1.asp method=post name=form >
< b >查询字符串:< /b >
< input type=text size=30 maxlength=50 name=S >&nbsp;
&nbsp; < INPUT type=submit value=查询
onClick=“return Check()" >
&nbsp;&nbsp;< INPUT onclick=parent.location.href=
‘http://www.lyac.edu.cn' style=BACKGROUND-COLOR:
#009090; COLOR: #ffffdd type=button value=返回主页 >
< /FORM >
< /CENTER >
< br >
< b >< font color=“#FF0000" >使用说明< /font >:
< /b >< br >< br >
查询字符串区可输入查询短语和逻辑运算符,
查询短语之间可做如下逻辑运算:< br >
“< font color=“#FF0000" >*< /font >”或运算,
如“< font color=“#FF0000" >动物*疾病< /font >”,
则包含“< font color=“#FF0000" >动物< /font >”
或者“< font color=“#FF0000" >疾病< /font >”的
记录都被选中;< br >
“< font color=“#FF0000” >+< /font >”与运算,
如“< font color=“#FF0000” >农学+农药< /font >”,
则只有同时包含“< font color=“#FF0000" >农学
< /font >”和“< font color=“#FF0000" >农药< /font >”
的记录才被选中;< br >
“< font color=“#FF0000” >-< /font >”非运算,
如“< font color=“#FF0000” >科技-农业< /font >”,
则只有包含“< font color=“FF0000" >科技< /font >”
并且不包含“< font color=“#FF0000" >农业< /font >”
的记录才被选中;< /font >
< br >< br >
< b >
< hr size=“4" color=“#008080" >
< center >< br >< /b >< font color=“#800080" size=
“3" >(C)COPYRIGHT 水杉林创作室< /font >
2000.7.2< /font >< /center >
< /BODY >< /HTML >
//S1.ASP
< %
dim i,j,k
const pagesize=20 ‘定义每屏所显示的记录条数
S=Trim(Request.Form(“S"))
'提出来自用户浏览器端的查寻请求
dim a(9),b(9),c(9)
‘定义数组变量,可根据实际检索需求,增加数组的范围
for i=2 to len(s)-1 ‘处理查寻字符患,确定逻辑运算类型
if mid(s,i,1)=“*" or mid(s,i,1)=“+"
or mid(s,i,1)=“-" then
‘约定各种逻辑运算所使用的符号为:
“与”运算为“+”号,“或”运算为
“*”号,“非”运算为“-”号
a(j)=i
select case mid(s,i,1)
case “*"
b(j)=“or"
case “+"
b(j)=“and"
case “-"
b(j)=“not"
end select
j=j+1
end if
next
if j< >0 then
for k=0 to j ‘根据逻辑运算类型,构造检索算法
select case k
case 0:
c(k)=“(classid like ‘%"+mid(s,1,a(k)-1)+“%’
or subject like ‘%"+mid(s,1,a(k)-1)+“%') "
‘其中的classid、subject为对其实施检索的字段
case j:
if b(k-1)=“not" thenc(k)=“and classid not like
‘%"+mid(s,a(k-1)+1,len(s)-a(k-1))+
“%' and subject not like ‘%"+mid(s,a(k-1)+1,
len(s)-a(k-1))+“%'"
else
c(k)=b(k-1)“(classid like '%"+mid(s,a(k-1)
+1,len(s)-a(k-1))+“%' or subject like ‘%"+
mid(s,a(k-1)+1,len(s)-a(k-1))+“%')"
end if
case else:
if b(k-1)=“or" or b(k-1)=“and" then
c(k)=b(k-1)+“(classid like ‘%"+mid (s,
a(k-1)+1,a(k)-a(k-1)-1)+“%' or subject
like ‘%"+mid(s,a(k-1)+1,a(k)-a(k-1)-1)
+“%') "
else
c(k)=“and classid not like ‘%"+mid(s,a(k-1)
+1,a(k)-a(k-1)-1)+“%' and subject not like
‘%"+mid(s,a(k-1)+1,a(k)-a(k-1)-1)+“%'"
end if
end select
d=d+c(k)
next
else
d=“classid like ‘%"+s+“%' or subject like
‘%"+s+“%'"
end if
Set conn= Server.CreateObject(“ADODB.Connection")
‘建立数据库连接
conn.connectionstring=“driver={sql server};
server=media_lib;uid=;pwd=;database=mmm_lib"
conn.open
set Session(“rs")=server.createobject
(“adodb.recordset")
sql=“select classid,code,subject,c_length,lang,c_type
from sc_jcml where ”&d&“"
Session(“rs").open sql,conn,3,2,1
Session(“rs").pagesize=pagesize
if session(“rs").recordcount< >0 then
Response.write “< table border=3 >"
Response.write “< tr >"
response.write “< td >顺序< /td >"
‘确定检索结果中所要显示项目
Response.write “< td >学科< /td >< td >编号< /td >
< td >课程名称< /td >< td >磁带长度< /td >
< td >语种< /td >< td >磁带类型< /td >"
response.write “< /tr >"
for j=1 to Session(“rs").pagesize
response.write “< tr >"
response.write “< td >"&Session(“rs").
absoluteposition&“< /td >"
for i=0 to Session(“rs").fields.count-1
response.write “< td >"&Session(“rs")(i).
value&“< /td >"
next
response.write “< /tr >"
Session(“rs").movenext
if Session(“rs").eof then
exit for
end if
next
Response.write “< /table >< br >"
else
response.write “< font color=ff0000 >
没找到符合条件的记录!< /font >< br >< br >"
end if
% >
< !--#include file=“link.asp"-- >
//S2.ASP
< %
session(“rs").absolutepage=request(“page")
s=request(“var")
response.write “< table border=3 >"
response.write “< tr >"
response.write “< td >顺序< /td >"
Response.write “< td >学科< /td >< td >编号< /td >
< td >课程名称< /td >< td >磁带长度< /td >
< td >语种< /td >< td >磁带类型< /td >"
response.write “< /tr >"
for j=1 to session(“rs").pagesize
response.write“< tr >"
response.write“< td >"&session(“rs").
absoluteposition&“< /td >"
for i=0 to session(“rs").fields.count-1
response.write “< td >"&session
(“rs")(i).value&“< /td >"
next
response.write “< /tr >"
session(“rs").movenext
if session(“rs").eof then
exit for
end if
next
response.write “< /table >< br >"
% >
< !--#include file=“link.asp"-- >
//LINK.ASP
< %
if session(“rs").absolutepage >0 then
nowpage=session(“rs").absolutepage-1
else
nowpage=session(“rs").pagecount
end if
response.write “< font size=2 >|当前页数:
"&nowpage&“"
response.write “|总页数:"&session(“rs").
pagecount&“"
response.write “|总记录数:"&session
(“rs").recordcount&“"
response.write “|每页记录数:"&session
(“rs").pagesize&“< /font >< br >"
留言区(共0条)