stmt.close();
}
catch(SQLException ex)
{
out.print(ex.getMessage());
}
}
if(conn!=null)
{
try
{
conn.close();
}
catch(SQLException ex)
{
out.print(ex.getMessage());
}
}
}
%>
</body>
</html>
3.5使用PHP实现常规的数据库搜索
这一节的案例演示了基于数据库的常规搜索,使用PHP5.1.4技术,MySQL5.0.19数据库中服务器。
这里,新建一个测试数据库,名为tianen,其中含有一个表格,名为test。可以通过在MySQL命令行程序中运行下面的脚本来实现建立数据库和添加测试数据。
案例名称:建立测试数据库
程序名称:tianen.sql
create database tianen;
use tianen;
create table test
(
id int auto increment primary key,
title varchar(50),
content varchar(5000),
common varchar(50)
);
insert into test(title,content,common)values("祖国的名字","我们的祖国叫中国","中国");
insert into test(title,content,common)values("祖国的历史","我们的祖国有上下五千年的悠久历史","悠久古老");
insert into test(title,content,common)values("祖国的文明","我们的祖国有灿烂的文明","灿烂");
insert into test(title,content,common)values("祖国的人民","我们的祖国有十几亿勤劳的人民","勤劳");
insert into test(title,content,common)values("祖国的未来","祖国的未来,在手中","未来");
3.5.1使用PHP实现精确搜索
案例名称:精确搜索
程序名称:exact.php
<?php
echo"<table border=2bordercolor=red>";
$ connect=@ mysql connect("localhost","root","tianen");//连接数据库服务器
if(!$ connect)//验证连接是否成功
{
echo"wrong.";
exit;
}
mysql select db("tianen",$ connect);//选择数据库
$ query="select*from test where id=1";//构造sql选择语句
$ result=mysql query($ query);//执行sql语句,将结果赋予$ result
$ rows=@ mysql num rows($ result);//返回记录数目
for($ i=0;$ i<$ rows;$ i++)//遍历记录
{
@ mysql data seek($ result,$ i);//定位记录
$ data=@ mysql fetch array($ result);//获得记录数组$ data
$ id=$ data[0];//获得相应字段值
$ title=$ data[1];
$ content=$ data[2];
$ common=$ data[3];
echo"<tr><td>".$ id."</td><td>".$ title."</td><td>".$ content."</td><td>".
$ common."</td></tr>";
}
echo"</table>";
mysql free result($ result);
mysql close($ connect);//关闭数据库连接
?>
3.5.2使用PHP实现范围搜索
案例名称:范围搜索
程序名称:range.php
<?php
echo"<table border=2bordercolor=red>";
$ connect=@ mysql connect("localhost","root","tianen");//连接数据库服务器
if(!$ connect)//验证连接是否成功
{
echo"wrong.";
exit;
}
mysql select db("tianen",$ connect);//选择数据库
$ query="select*from test where id in(1,2,3)";//构造sql选择语句
$ result=mysql query($ query);//执行sql语句,将结果赋予 $ result
$ rows=@ mysql num rows($ result);//返回记录数目
for($ i=0;$ i<$ rows;$ i++)//遍历记录
{
@ mysql data seek($ result,$ i);//定位记录
$ data=@ mysql fetch array($ result);//获得记录数组$ data
$ id=$ data[0];//获得相应字段值
$ title=$ data[1];
$ content=$ data[2];
$ common=$ data[3];
echo"<tr><td>".$ id."</td><td>".$ title."</td><td>".$ content."</td><td>".
$ common."</td></tr>";
}
echo"</table>";
mysql free result($ result);
mysql close($ connect);//关闭数据库连接
?>
3.5.3使用PHP实现模糊搜索
这里演示使用“%”进行模式匹配的情况。
案例名称:模糊搜索
程序名称:fuzzy.php
<?php
echo"<table border=2bordercolor=red>";
$ connect=@ mysql connect("localhost","root","tianen");//连接数据库服务器
if(!$ connect)//验证连接是否成功
{
echo"wrong.";
exit;
}
mysql select db("tianen",$ connect);//选择数据库
$ query="select*from test where content like"%灿烂%"";//构造sql选择语句
$ result=mysql query($ query);//执行sql语句,将结果赋予$ result
$ rows=@ mysql num rows($ result);//返回记录数目
for($ i=0;$ i<$ rows;$ i++)//遍历记录
{
@ mysql data seek($ result,$ i);//定位记录
$ data=@ mysql fetch array($ result);//获得记录数组$ data
$ id=$ data[0];//获得相应字段值
$ title=$ data[1];
$ content=$ data[2];
$ common=$ data[3];
echo"<tr><td>".$ id."</td><td>".$ title."</td><td>".$ content."</td><td>".
$ common."</td></tr>";
}
echo"</table>";
mysql free result($ result);
mysql close($ connect);//关闭数据库连接
?>
3.6常规搜索的弊端
前面复习了数据库常规搜索的基本方法,看起来,似乎使用了常规的模糊搜索就可以解决全文检索的问题,是这样吗?
当然不是。在前面的章节中笔者已经介绍过了,在数据量很少的时候还可以做到快速检索,当数据量加大的时候,搜索速度就非常慢了。因为需要一条一条记录地查看、匹配,记录数量越多,搜索越慢。
读者可以试着将数据库的表格内容增加到10万条,然后执行原来的程序,将发现页面长时间无法显示,如果没有设置脚本运行时间加长的话,最后的结果将是程序运行超时、退出。
常规搜索的弊端就在这里,正是因为常规的模糊搜索无法应付大量的数据,所以出现了基于倒排索引的全文搜索技术。
当然,如果读者只想做一个少量数据的信息管理系统,要在其中实现全文搜索,还是可以用like谓词的,用常规方法就可以解决问题的时候就不要浪费资源、浪费精力。即便是读者要做一个小规模的论坛或个人博客,也还是可以用常规的搜索方法,但是要做数据库优化、应用程序缓存优化、SQL语句优化等工作,还要对访客的搜索行为作适当的限制以避免对服务器造成大冲击。
讲这些目的在于:如果读者是为了解决眼前的小问题,那么,掌握这些知识就可以了,后面要讲的技术比常规的搜索技术要稍微复杂一些。读者应该了解,只要能在常规的搜索中做好优化,依然能解决大量的实际问题。
从下一章起,开始介绍基于数据库的全文搜索的实现,全文搜索的实现原理和普通的数据库搜索是完全不同的。使用全文搜索技术,可以解决更高层面的问题。
小结
本章介绍了基于数据库的常规搜索的原理和相关技术,举了一些例子来说明这些问题。
这一章是总结旧知识,为下一章学习数据库的全文搜索作准备。
思考与练习
1.使用JSP实现一个普通的数据库搜索引擎。
2.精确搜索和模糊搜索的分别是什么?