开发实例:JSP中实现全文检索

JSP中的全文检索

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

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

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

<html>

<head>

<link rel="stylesheet" href="css/style3.css">

<title>新闻搜索</title>

<script language="javascript">

function subform()

{

if (document.zl_form.keyword.value=="")

{

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

document.zl_form.keyword.focus();

return false;

}

return true;

}

</script>

</head>

<body bgcolor="#F0F6E2">

<form name="zl_form"  target="_new" method="post" action="aftsearch.jsp" onsubmit="return subform()">

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

<tr>

<td colspan="4" height="10">  </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">

<br>

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

</tr>
</table>

</form>

</body>

</html>

下面的代码是全文检索主体javabean的代码:newsSearch.java

package NEWS;

import java.sql.*;

import java.lang.*;

import java.text.*;

import java.util.*;

import java.io.*;

import java.util.regex.*;

import DBstep.iDBManager2000;//数据库操作的bean

public class newsSearch {

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

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

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

public newsSearch() { }

public void setFilePath(String s) {

this.filePath=s;

}

public void setKeyWord(String s) {

this.keyWord=s;

}

public Vector getResult() {

return news;

}

public void search() {

//打开数据库

ResultSet result=null;

String mSql=null;

PreparedStatement prestmt=null;

DBstep.iDBManager2000 DbaObj=new DBstep.iDBManager2000();

DbaObj.OpenConnection();

try {

//检索所有的新闻

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

result=DbaObj.ExecuteQuery(mSql);

while(result.next())

{

String id=result.getString("id");

String title=result.getString("title");

String release_time=result.getString("release_time");

String news_type=result.getString("type");

String content=result.getString("content");

String man_add=result.getString("man_add");

//按行读文件

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

FileReader  myFileReader=new FileReader(trace);

BufferedReader myBufferedReader=new BufferedReader(myFileReader);

String myString=null;

String resultString=new String();

while((myString=myBufferedReader.readLine())!=null)

{

resultString=resultString+myString;

}

//去掉多余字符

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

resultString=Html.TextEncode(resultString);

myFileReader.close();

//取出查询关键字

Pattern p=null;

Matcher m=null;

p = Pattern.compile("\\+");

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

//全文检索

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

int i;

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

{

p = Pattern.compile(a[i].toString());

m = p.matcher(resultString);

if (!(m.find())) {

searchResult="0";

}

}

//记录符合条件的新闻

if(searchResult.equals("1"))

{

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

resultNews.content=content;

resultNews.release_time=release_time;

resultNews.type=news_type;

resultNews.man_add=man_add;

resultNews.title=title;

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

}

}

//关闭数据库

DbaObj.CloseConnection() ;

}catch(Exception e){

System.out.println(e.toString());

}

}

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

String content;

String release_time;

String type;

String man_add;

String title;

public String getContent() { return this.content; }

public String getTitle() { return this.title; }

public String getTime() { return this.release_time; }

public String getType() { return this.type; }

public String getMan_add() { return this.man_add; }

}

}

下面的代码是调用的:aftsearch.jsp

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

<%@ page import="java.util.*" %>

<%

request.setCharacterEncoding("GB2312");

String keyword=request.getParameter("keyword");  //接收关键字

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

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

newsSearch.setFilePath(trace);//设置主体新闻路径

newsSearch.setKeyWord(keyword);//设置关键字

newsSearch.search();//检索

Vector news=newsSearch.getResult();//取到结果

%>

<html>

<head>

<title>新闻搜索</title>

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

<link rel="stylesheet" href="../css/style3.css">

<script LANGUAGE="javascript">

function open_window(id)

{

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

window.open(locat,"new","width=550,height=500 ,scrollbars=yes")

}

</script>

</head>

<object id=hh2 classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11">

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

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

<script>

hh2.Click();

</script>

<table width="621" border="0">

<tr>

<td colspan=5>

</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(!(news.size()==0)) {

for (int i = 0; i < news.size(); i++) {

j++;

NEWS.newsSearch.News  myNews=(NEWS.newsSearch.News)news.get(i);

if(i%2==0)

{ color="#F5FAF3"; }

else { color="#DBF7ED";   }

%>

<tr  bgcolor = "<%=color%>">

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

<img src="./images/dot.gif" align = "absmiddle">

<a href="#"  onClick="open_window(<%=myNews.getContent()%>)"> <%=myNews.getTitle()%></a>

</td>

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

<%=myNews.getType()%>

</td>

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

<%=myNews.getMan_add()%>

</td>

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

<%=myNews.getTime()%>

</td>

</tr>

<% } } else{ out.println("对不起,没有搜索到您要查找的新闻");}  //和最前边的else对应,判断是否有记录 %>

<tr bgcolor="#B7D79F">

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

</tr>

<tr>

<td colspan=4>

<p align=right>

</td>

</tr>

</table>

<P align=center>                共搜索到新闻 <%=j%> 条

</body>

</html>

0

xmlscript.src="http://guide.pconline.com.cn/comment/commentService_js.jsp?"+(new Date());
0

xmlscript.src="http://guide.pconline.com.cn/comment/commentService_js.jsp?"+(new Date());
0

xmlscript.src="http://guide.pconline.com.cn/comment/commentService_js.jsp?"+(new Date());
0

xmlscript.src="http://guide.pconline.com.cn/comment/commentService_js.jsp?"+(new Date());
0

xmlscript.src="http://guide.pconline.com.cn/comment/commentService_js.jsp?"+(new Date()); (出处:CSDN)

(0)

相关推荐

  • 基于JavaScript实现类似于百度学术高级检索功能

    百度学术http://xueshu.baidu.com/高级检索是通过前台生成后台内部高级语法来实现高级检索的,可以通过前台js做字符串拼接传给后台实现,难度不大: 下面是高级检索的核心功能代码,我使用的是纯js实现,并未使用jquery: <p class="fl srh-btn"> <input type="submit" class="srh-submit" style="height:px" valu

  • 简单谈谈MySQL5.7 JSON格式检索

    MySQL5.7版本开始支持JSON格式,在创建表时,可以指定列表的数据类型为JSON,但是如何在JSON格式上创建索引呢?? 本人做了一个简单测试. 第一步:建立一个包含JSON类型的表: CREATE TABLE json_test` ( id` int (8) NOT NULL AUTO_INCREMENT, content` json NOT NULL , PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 第二步:初始化数据

  • javascript数据结构与算法之检索算法

    查找数据有2种方式,顺序查找和二分查找.顺序查找适用于元素随机排列的列表.二分查找适用于元素已排序的列表.二分查找效率更高,但是必须是已经排好序的列表元素集合. 一:顺序查找 顺序查找是从列表的第一个元素开始对列表元素逐个进行判断,直到找到了想要的结果,或者直到列表的结尾都没有找到想要找的元素. 代码如下: function seqSearch(data,arr) { for(var i = 0; i < arr.length; ++i) { if(arr[i] == data) { retur

  • js仿淘宝的拼音检索特效代码

    以下是HTML网页特效代码,点击运行按钮可查看效果 js仿taobao效果 *{ margin:0;padding:0;} body{ font:normal 12px Verdana, Arial, Helvetica, sans-serif; text- align:center;} #warpper{ position:absolute; left:100px; top:100px;} h5{ float:left;} a{ text-decoration:underline; curso

  • Js中使用hasOwnProperty方法检索ajax响应对象的例子

    经常使用百度搜索的同学,一定不会忽视输入框的下拉索引,它是如此方便,然而得天独厚的条件使得这项异步技术多少面临些考验,高并发的服务端请求督促着他们的前端攻城师必须尽可能地减少发送ajax的次数.听起来似乎与本文无关,但并不是这样.首先就暂且让我们为百度免费做个广告吧.在百度首页输入"前端"一词,利用chromebug可以很轻松地看到所发送的响应,结果显示如下: 复制代码 代码如下: window.bdsug.sug({q:'前端';,p:false,s:['前端开发','前端工程师',

  • JS实现移动端按首字母检索城市列表附源码下载

    我们常见的手机通讯录或微信通讯录,联系人信息是按字母顺序排列的列表,通过点击右侧的字母,会迅速定位检索到首字母对应的联系人.那么我今天给大家介绍的是按首字母快速定位到城市列表,效果和通讯录一样的.  查看演示 下载源码 准备 查看演示     下载源码 准备 首先我们需要用到全国的城市数据,这些城市数据来源于网络,我已经将数据格式化成JSON形式了,大家可以直接拿去用. 我们还需要用到一个叫better-scroll的滚动插件,它能帮我们将超长的页面原生的滚动条处理掉,优化滚动效果. 接着我们准

  • JSP开发中hibernate框架的常用检索方式总结

    总结hibernate框架的常用检索方式 1.hibernate框架的检索方式有以下几种: OID检索:根据唯一标识OID检索数据 对象导航检索:根据某个对象导航查询与该对象关联的对象数据 HQL检索:通过query接口对象查询 QBC检索:通过criteria接口对象查询 SQL检索:通过SQL语句查询  2.HQL检索方式: 查询全部数据:session.createQuery("from 类名"); 根据条件查询:session.createQuery("from 类名

  • JavaScript字符串检索字符的方法

    在字符串中检索字符的几种方式,供大家参考,具体内容如下 var text="abcdefgh你好,很高兴认识你!"; var str1="abc"; var str2="def"; var str3="ABC"; var str4="很高兴"; function isContain(str,substr){ return new RegExp(substr).test(str); } console.log

  • 在IE8上JS实现combobox支持拼音检索功能

    最近在ie8碰到一个js问题,需要实现(ie8)使用拼音或者拼音首字母来检索select中的内容,原来的combobox只能支持汉字输入检索,现在需要进行改进,现在我将一步一步的实现方法记录下来,功能简单,也可能有bug和不足,供学习参考.(本文只是提供思路学习和备份,实际情况需要在ie8或者ie兼容模式上使用,所以没有考虑到别的浏览器) 目录结构: test |--js |--index.html 在index页面中添加 index.html <!DOCTYPE html> <html

  • 开发实例:JSP中实现全文检索

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

  • JSP中param动作的实例详解

    JSP中param动作的实例详解 一 语法 <jsp:param name="参数名" value="参数值"> 常常与<jsp:forward>一起使用,作为其子标签存在. 二 代码 1.login.jsp <%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"

  • JSP中out对象的实例详解

    JSP中out对象的实例详解 一 什么是缓冲区 缓冲区:Buffer,所谓缓冲区就是内存的一块区域用来保存临时数据. 二 out对象 out对象是JspWrite类的实例,是向浏览器输出内容常用的对象. 三 常用方法 四 实例 <%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%> <% String path

  • jsp中使用javabean实例介绍

    test.jsp中的代码如下所示 复制代码 代码如下: <%@ page language = "java" import="test.SimpleBean;" %> <html><head><title>JSP中使用 Java Bean的测试</title></head><body><jsp:useBean id="test" class="te

  • jsp中select的onchange事件用法实例

    本文实例讲述了jsp中select的onchange事件用法.分享给大家供大家参考,具体如下: <script language = "JavaScript"> var onecount; onecount=0; subcat = new Array(); <% int count = 0; java.sql.ResultSet rs1 = DBManage.executeQuery("select hydm,zhydm,zhymc from zhy &qu

  • jsp中实现带滚动条的table表格实例代码

    如下所示: <div style="width:700px; height:225px; overflow:auto;"> <table border="1" width="100%" cellpadding="0" cellspacing="0"> <tr> <td width="3%">0</td> <td width

  • Android中的指纹识别demo开发实例

    指纹识别是在Android 6.0之后新增的功能,因此在使用的时候需要先判断用户手机的系统版本是否支持指纹识别.另外,实际开发场景中,使用指纹的主要场景有两种: 纯本地使用.即用户在本地完成指纹识别后,不需要将指纹的相关信息给后台. 与后台交互.用户在本地完成指纹识别后,需要将指纹相关的信息传给后台. 由于使用指纹识别功能需要一个加密对象(CryptoObject)该对象一般是由对称加密或者非对称加密获得.上述两种开发场景的实现大同小异,主要区别在于加密过程中密钥的创建和使用,一般来说,纯本地的

  • JSP中正则表达式用法实例

    本文实例讲述了JSP中正则表达式用法.分享给大家供大家参考,具体如下: <%@ page language="java" import="java.util.*,cn.com.Person,cn.com.Adddress" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+

  • jsp中自定义标签用法实例分析

    本文实例讲述了jsp中自定义标签用法.分享给大家供大家参考.具体如下: 这里简单的写了一个自定义标签,自己定义标签的好处就是在jsp页面中可以使用自己定义的功能,完全与Java代码分离 1. tld文件如下: 首先是要写×.tld文件,当项目随着服务器启动的时候,会检查项目中有没有*tld文件. 写的tld文件 <?xml version="1.0" encoding="UTF-8" ?> <taglib xmlns="http://ja

  • JSP中param标签用法实例分析

    本文实例分析了JSP中param标签用法.分享给大家供大家参考,具体如下: Jsp中param标签的使用 <jsp:param>操作被用来以"名-值"对的形式为其他标签提供附加信息.它和<jsp:include>.<jsp:forward>.<jsp:plugin>一起使用,方法如下: 复制代码 代码如下: <jsp:param name="paramName" value="paramValue&qu

随机推荐