<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 3, 文章 - 152, 評論 - 17, 引用 - 0
    數(shù)據(jù)加載中……

    JSP中的全文檢索

    全文檢索一直都是web方面的關鍵技術,如何在浩如煙海的信息中找到自己想要的信息是人們最關心的。鼎鼎大名的GOOGLE就是一個很成功的例子,網(wǎng)絡上的人們大部分都用GOOGLE來查找自己需要的內容。全文檢索主要有兩個技術指標:快速和精確。前一段時間做了一個新聞系統(tǒng),老板要加上全文檢索的功能,想了很久才用一個不太高明的方法實現(xiàn)了。現(xiàn)在分享一下,希望是拋磚引玉吧,如果大家有更好的辦法請跟在后邊:)

    先介紹一下我的新聞系統(tǒng):數(shù)據(jù)庫里存新聞的基本信息,如標題,發(fā)布人,發(fā)布時間,主體新聞的文件名。新聞主體是html格式的靜態(tài)頁(第一是要提高速度,減少數(shù)據(jù)庫的壓力。第二是數(shù)據(jù)庫處理大字符串的時候會有問題。)。全文檢索的思路是:先從數(shù)據(jù)庫里把所有的新聞檢索出來,把主體新聞找到,然后通過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">&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">說明:如果有多個查詢條件,中間用</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;//數(shù)據(jù)庫操作的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() {

      //打開數(shù)據(jù)庫

    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();//存放結果的類,和數(shù)據(jù)庫的結構基本一致

       resultNews.content=content;

       resultNews.release_time=release_time;

       resultNews.type=news_type;

       resultNews.man_add=man_add;

       resultNews.title=title;

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

       }

       }

      //關閉數(shù)據(jù)庫

      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>

          &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">發(fā) </div>

        </td>

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

          <div align="center" class = "t_header">發(fā) </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>

    &nbsp;&nbsp;

                 </td>

                 </tr>

           </table>

    <P align=center> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;共搜索到新聞 <%=j%>  

    </body>

    </html>

    這個方法比較原始,但是時間有限,也沒辦法了,先湊合用。我在自己機器測試:100條記錄的時候檢索時間是9秒,200條是10秒,300條是12秒。也是可以接受的:)。

    這個是基于數(shù)據(jù)庫的,大家可以很容易的擴展到基于文件夾的,只要把文件夾下的所有文件都遍歷件出來,就可以和上邊的方法一樣做全文檢索了,文件必須是文本格式的才可以。不過那樣的話速度方面就沒有保證了。

    全文檢索是一個大課題,有很多因素要考慮,還有很多技術。這個只是為我的新聞系統(tǒng)做的,也許方法很原始,這也是我能想到的最好的辦法了。大家如果有好的全文檢索的辦法請跟在下面,謝謝。

    posted on 2005-03-28 10:02 閱讀(227) 評論(0)  編輯  收藏 所屬分類: J2ee

    主站蜘蛛池模板: 中文字幕无码播放免费| 日韩视频在线精品视频免费观看| 国产亚洲一区二区三区在线| 免费在线观看一级片| 亚洲影视自拍揄拍愉拍| 一本色道久久88综合亚洲精品高清| 精品一区二区三区免费| 亚洲一区二区三区高清在线观看 | 亚洲AV日韩精品久久久久久久 | 一级做a爰片久久毛片免费陪 | 久久夜色精品国产噜噜亚洲a| 午夜亚洲国产成人不卡在线| 免费看黄的成人APP| 中文无码亚洲精品字幕| 亚洲欧洲无码AV电影在线观看 | 国产无限免费观看黄网站| 亚洲国产电影在线观看| 亚洲天堂免费在线视频| 91九色精品国产免费| 久草免费福利在线| 久久乐国产综合亚洲精品| 亚洲精品国产品国语在线| 麻豆国产人免费人成免费视频| 免费人成激情视频在线观看冫| 在线观看亚洲网站| 亚洲色图黄色小说| 久久夜色精品国产亚洲av| 大地资源免费更新在线播放| 精品视频一区二区三区免费| 免费在线观看自拍性爱视频| 亚洲欧洲精品在线| 亚洲成AV人在线观看天堂无码| 一本久久综合亚洲鲁鲁五月天| 最近免费中文字幕大全| 日韩免费无码视频一区二区三区| 免费福利在线观看| 亚洲AV成人精品日韩一区| 亚洲校园春色另类激情| 久久久久亚洲精品无码蜜桃| 亚洲中文字幕不卡无码| 亚洲高清成人一区二区三区|