首页 >> 民生法规

开发实例JSP中实现全文检索节能

民生法规  2020-10-28 06:26 字号: 大 中 小

JSP中的全文检索

全文检索一直都是web方面的关键技术,如何在浩如烟海的信息中找到自己想要的信息是人们最关心的。鼎鼎大名的GOOGLE就是一个很成功的例子,络上的人们大部分都用GOOGLE来查找自己需要的内容。全文检索主要有两个技术指标:快速和精确。前一段时间做了一个系统,老板要加上全文检索的功能,想了很久才用一个不太高明的方法实现了。现在分享一下,希望是抛砖引玉吧,如果大家有更好的办法请跟在后边:)

先介绍一下我的系统:数据库里存的基本信息,如标题,发布人,发布时间,主体的文件名。主体是html格式的静态页(第一是要提高速度,减少数据库的压力。第二是数据库处理大字符串的时候会有问题。)。全文检索的思路是:先从数据库里把所有的检索出来,把主体找到,然后通过io操作把主体读到一个字符串中。再去掉多余的东西,象html标记什么的,再用正则表达式对这个字符串查找,如果找到符合条件的信息,就记录这条。最后返回所有的符合条件的显示给用户。

下面这段代码是输入查询条件的代码,查询关键字用”+”隔开:p

html

head

link rel="stylesheet" href="css/s"

title搜索/title

script language="javascript"

function subform()

{

if (_lue=="")

{

alert("请输入关键字!");

_cus();

return false;

}

return true;

}

/script

/head

body bgcolor="#F0F6E2"

form name="zl_form" target="_new" method="post" action="p" onsubmit="return subform()"

table width="600" bgcolor="#F0F6E2"

tr

td colspan="4" height="10"nbsp; /td

/tr

tr

td width="14%"输入查询关键字:/td

td align="left" width="65%"

input size="50" type="text" name="keyword" style="font-size: 9pt"

input type="submit" name="submit" value="搜索" style="font-size: 9pt"

/td

/tr

tr

td colspan="2" height="9" align="left"

nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;br

font color="red" size="+1"说明:如果有多个查询条件,中间用/fontfont size="+2"+/fontfont color="red" size="+1"隔开。如:1+2+3+4.../font/td

/tr

[下一页]

/table

/form

/body

/html

下面的代码是全文检索主体javabean的代码:va

package NEWS;

import l.*;

import ng.*;

import xt.*;

import il.*;

import .*;

import gex.*;

import BManager2000;//数据库操作的bean

public class newsSearch {

private String filePath=null;//主体存放的目录

private String keyWord=null;//查询关键字

private Vector news = new Vector();//存放符合条件的结果

public newsSearch() { }

public void setFilePath(String s) {

lePath=s;

}

public void setKeyWord(String s) {

yWord=s;

}

public Vector getResult() {

return news;

}

public void search() {

file://打开数据库

ResultSet result=null;

String mSql=null;

PreparedStatement prestmt=null;

BManager2000 DbaObj=new BManager2000();

enConnection();

try {

file://检索所有的

mSql="select * from t_news_detail order by release_time desc";

result=ecuteQuery(mSql);

while(xt())

{

String id=tString("id");

String title=tString("title");

String release_time=tString("release_time");

String news_type=tString("type");

String content=tString("content");

String man_add=tString("man_add");

file://按行读文件

String trace=filePath+content+".html";

FileReader myFileReader=new FileReader(trace);

BufferedReader myBufferedReader=new BufferedReader(myFileReader);

String myString=null;

String resultString=new String();

while((myString=adLine())!=null)

{

resultString=resultString+myString;

}

file://去掉多余字符

mlEncode Html=new mlEncode();//这个bean去掉多余的字符,是自己生成的文件,可以尽量多的删除多余字符

[下一页]

resultString=xtEncode(resultString);

ose();

file://取出查询关键字

Pattern p=null;

Matcher m=null;

p = pile("\\+");

String[] a=lit(keyWord);//把关键字用+分开

file://全文检索

String searchResult="1";//检索结果

int i;

for(i=0;ngth;i++)//逐个按关键字查找,如果所有的关键字都符合,则记录结果

{

p = pile(a[i].toString());

m = tcher(resultString);

if (!(nd())) {

searchResult="0";

}

}

file://记录符合条件的

if(uals("1"))

{

News resultNews=new News();//存放结果的类,和数据库的结构基本一致

ntent=content;

lease_time=release_time;

pe=news_type;

n_add=man_add;

tle=title;

dElement(resultNews);//最后的结果集,要返回客户端

}

}

file://以北京为起点关闭数据库

oseConnection() ;

/SPAN}catch(Exception e){

intln(String());

}

}

public class News { file://存放结果的类

String content;

String release_time;

String type;

String man_add;

String title;

public String getContent() { return ntent; }

public String getTitle() { return tle; }

public String getTime() { return lease_time; }

public String其因 getType() { return pe; }

public String getMan_add() { return n_add; }

}

}

下面的代码是调用的:p

%@ page contentType="text/html; charset=gb2312" %

%@ page import="il.*" %

%

tCharacterEncoding("GB2312");

String keyword=tParameter("keyword"); file://接收关键字

String trace=getServletContext().getRealPath("/")+"xwxx\\news\\";//主体存放路径

wsSearch newsSearch=new wsSearch();//初始化检索的bean

tFilePath(trace);//设置主体路径

tKeyWord(keyword);//设置关键字

arch();//检索

Vector news=tResult();//取到结果

%

html

head

title搜索/title

META HTTP-EQUIV="Cache-Control" CONTENT="no-cache"

link rel="stylesheet" href="../css/s"

l;script LANGUAGE="javascript"

function open_window(id)

{

locat="./news/"+id+".html";

[下一页]

en(locat,"new","width=550,height=500 ,scrollbars=yes")

}

/script

/head

object id=hh2 classid="clsid:ADB880A6-D8FF-11CF-AA003B7A11"

param name="Command" value="Maximize"/object

body bgcolor=#F5FAF3 leftmargin="0" topmargin="0" marginwidth="0" marginheight="0"

script

ick();

/script

table width="621" border="0"

tr

td colspan=5

nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;

nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;

nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;

/font

/td

/tr

tr valign="middle"

td width="45%" height="22"

div align="center" class = "t_header"标 题/div

/td

td width="15%" height="22"

div align="center" class = "t_header"类 别/div

/td

td width="15%" height="22"

div align="center" class = "t_header"发 布 人/div

/td

td width="25%" height="22"

div align="center" class = "t_header"发 布 时 间/div

/td

/tr

tr bgcolor="#B7D79F" valign="middle"

td colspan="4" height="2"/td

/tr

/table

table width="624" border="0" bordercolor="#99CCFF"

%

String color=null;

int j=0;

if(!(ze()==0)) {

for (int i = 0; i ze(); i++) {

j++;

ws myNews=(ws)t(i);

if(i%2==0)

{ color="#F5FAF3"; }

else { color="#DBF7ED"; }

%

tr bgcolor = "%=color%"

td width="45%" height="20"

img src="./images/f" align = "absmiddle"

a href="#" onClick="open_window(%=tContent()%)" %=tTitle()%/a

[下一页]

/td

td width="15%" height="20" align="center"

%=tType()%

nbs; /td

td width="15%" height="20" align="center"

%=tMan_add()%

/td

td width="25%" height="20" align="center"

%=tTime()%

/td

/tr

% } } else{ intln("对不起,没有搜索到您要查找的");} file://和最前边的else对应,判断是否有记录 %

tr bgcolor="#B7D79F"

td colspan="4" height="2"/td

/tr

tr

td colspan=4

p align=right

nbsp;nbsp;

/td

/tr

/table

P align=center nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp; nbsp;共搜索到 %=j% 条

/body

/html

滨州白癜风医院哪家较好
哪里治心绞痛最好
两岁孩子拉肚子怎么办
推荐资讯