網站內部搜索引擎簡單實現


    (原創,轉載請注明)

     不久前接手一個java web開發的活,網站是一個學術期刊的發布和共享平台。支持在線搜索網站內部期刊。以前沒接觸過搜索引擎,覺得搜索是一門高深的學問,后來折騰了兩天寫了一個簡單的,不包含權重排序、爬蟲和大型數據庫和全文搜索(貌似中文不支持全文搜索),不涉及自然語言處理相關的語義、分詞等的搜索引擎。就是大概完成了搜索的大體流程,適合初學者了解搜索的大體步驟。

我的簡單搜索引擎實現以下工作:

  1. 用戶可根據標題、作者、關鍵字和全面檢索,來搜尋相關期刊;
  2. 暫時只支持單個詞的搜索,如果用戶同時輸入多個詞進行搜索,比如“農業 大數據 可視化”,我是按一個字符串來處理,而非農業、大數據、可視化三個詞進行處理;

          

     3. 由於中文不支持“全文檢索”(要么就是支持但我沒查到),我只能按照數據庫的不同字段檢索,得到的結果不分先后順序(如果想提高准確率也可以做一個權重系統,權重高的排在前面);

     4. 如果用戶選擇“全面搜索”,那就分別檢索表中各個字段,然后剔除檢索結果中重復的部分;

     5. 根據關鍵字得到搜索結果,並在新的頁面顯示結果,新的頁面參照百度的頁面,比價簡單;

     6. 項目很緊,好多東西沒做,很多工作簡化了,像翻頁啊、排序啊、分詞什么的都沒做;

       

 

 

具體實現及代碼如下:

index.jsp頁面,搜索引擎前端代碼:

 1           <!-- search added by xxxx -->
 2           <td width="30" height="43"><table width="10%" border="0" align="left">
 3              <tr>
 4                 <td>&nbsp;&nbsp;</td>
 5                 <td><div align="center" id="id_search">
 6                     <input name="textfield" type="text" id="inp_search" size="40" /></div>
 7                 </td>
 8                     <td>
 9                         <select name="cars" id="select_id">
10                              <option value="title" selected="selected">標題</option>
11                              <option value="author">作者</option>
12                              <option value="keyword">關鍵字</option>
13                              <option value="fulltext">全面檢索</option>
14                         </select>
15                     </td>   
16                     <td><img border="0" img="img" src="kzkj/images/sy_07-1.png" onClick="linkto_search()"/></td>   
17               </tr>
18           </table></td> 

index.jsp頁面,搜索引擎javascript代碼:

這段代碼把搜索框里的內容var keyname,和搜索類型var selectValue以url參數形式傳遞給search.jsp頁面,在那里完成搜索和顯示工作;

 1 <script>  
 2 function linkto_search(){   
 3    var keyname = document.getElementById("inp_search").value;
 4    var selectValue=$("#select_id").val();  //獲取Select選擇的value
 5    if(document.getElementById("inp_search").value == "" || document.getElementById("inp_search").value == null){
 6        window.location.href="kzkj_test.jsp"; 
 7    }
 8    else{//&& srchtype != null && srchtype != ""
 9        window.location.href="search.jsp?srchtype="+selectValue+"&keyword="+keyname; 
10    }
11 }  
12 </script>  

 跳轉到search.jsp頁面,先獲取url中的參數keyname和selectValue;

連接數據庫,根據selectValue的值確定是按照作者、關鍵字還是全文進行搜索;

將搜索結果的id、標題和摘要,分別存入數組tmp_srchRet_id,tmp_srchRet_title,tmp_srchRet_abstract;

最后從搜索結果中剔除那些重復的內容(比如按作者和關鍵字都搜到了id為n的那一列,需要剔除id重復的列);

<%
                                 Class.forName( "org.gjt.mm.mysql.Driver").newInstance(); 
                               String url= "jdbc:mysql://localhost/kzkj?useUnicode=true&characterEncoding=utf-8"; 
                               String user="root"; 
                            String password="123456"; 
                               Connection conn=DriverManager.getConnection(url,user,password); 
                               Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); 
                               //以上是連接數據庫的代碼
                                 String mykeyword=request.getParameter("keyword");
                                 String mysrchtype=request.getParameter("srchtype");
                               //以上是從url中得到關鍵字和搜索類型                            
                               ArrayList ret_srch = new ArrayList(); //save all the content in every colom in DB which contain the keyword
                               ArrayList ret_srchIDlist = new ArrayList(); //save all the id in DB which contain the keyword
                               ArrayList ret_srchtype = new ArrayList(); 
                               if(mysrchtype.equals("fulltext")){
                                   ret_srchtype.add("title");    
                                   ret_srchtype.add("author");    
                                   ret_srchtype.add("keyword");    
                               }  
                               else{
                                   ret_srchtype.add(mysrchtype);    
                               }            
                               //ret_srchtype存放搜索類型,如果是fulltext類型則按照title、author、keyword進行全文檢索;     

                                 for(int j = 0;j < ret_srchtype.size();j++){//分別按照不同搜索類型搜索一遍
                                         String tmpsrchtype = ret_srchtype.get(j).toString();
                                        String sql_user= "SELECT * FROM t_kzkj WHERE " + tmpsrchtype + " LIKE '%" + mykeyword + "%'";//如果搜索結果null也報錯
                                        ResultSet res = stmt.executeQuery(sql_user);    
                                     if(res.first()){//不為空則證明數據庫該列中包含該關鍵字;
                                         ret_srch.add(res.getString(tmpsrchtype).toString());    
                                         String tmp_id = res.getString("id").toString();
                                         if(!ret_srchIDlist.contains(tmp_id))   ret_srchIDlist.add(tmp_id);//將找到的字段對應的id存入ret_srchIDlist     
                                               while (res.next()) {//處理搜索結果中包含該關鍵字的其他列;
                                                   ret_srch.add(res.getString(tmpsrchtype).toString());    
                                                   tmp_id = res.getString("id").toString();
                                                   if(!ret_srchIDlist.contains(tmp_id))   ret_srchIDlist.add(tmp_id);             
                                                }
                                      }
                                       if (res != null) res.close(); 
                                 }
                                 
                                                                
                               /* 獲得對應id的title,abstract等  */     
                             ArrayList ret_srch_title = new ArrayList(); //最終搜索結果的標題列表,該列表不包含重復內容
                             ArrayList ret_srch_abstract = new ArrayList();  //最終搜索結果的摘要列表,該列表不包含重復內容
                               int k = 0;
                               Iterator id_list = ret_srchIDlist.iterator();     
                               while(id_list.hasNext()) { 
                                    if(k < 10 && k < ret_srchIDlist.size()){//從ret_srchIDlist(包含id重復項)中選出不包含重復內容的結果,存入結果列表
                                         int myid = Integer.parseInt(id_list.next().toString());//id
                                        String sql_user= "SELECT * FROM t_kzkj WHERE id=" + myid;//如果搜索結果null也報錯
                                        ResultSet res = stmt.executeQuery(sql_user);    
                                         if(res.first()){
                                         ret_srch_title.add(res.getString("title").toString());    
                                         ret_srch_abstract.add(res.getString("abstract").toString());          
                                               while (res.next()) {        
                                                 ret_srch_title.add(res.getString("title").toString());    
                                                 ret_srch_abstract.add(res.getString("abstract").toString());                      
                                              }
                                      }
                                       if (res != null) res.close(); 
                                    }
                                    else break;
                                    k++;
                               }
                                 
                                 String[] tmp_srchRet_id = {"","","","","","","","","",""};    //所有用於顯示的id,僅顯示10個搜索結果
                                 String[] tmp_srchRet_title = {"","","","","","","","","",""};    //所有用於顯示的id,僅顯示10個搜索結果
                                 String[] tmp_srchRet_abstract = {"","","","","","","","","",""};    //所有用於顯示的id,僅顯示10個搜索結果                    
                                 Object[] ret_srchIDlist_array = ret_srchIDlist.toArray();
                                 Object[] ret_srchTitle_array = ret_srch_title.toArray();
                                 Object[] ret_srchAbstract_array = ret_srch_abstract.toArray();
                                 int n = ret_srchIDlist.size();
                                 for(int j = 0;j < 10 && j < n;j++){
                                    if(!ret_srchIDlist_array[j].toString().isEmpty()){
                                         tmp_srchRet_id[j] = ret_srchIDlist_array[j].toString();
                                         tmp_srchRet_title[j] = ret_srchTitle_array[j].toString();
                                         tmp_srchRet_abstract[j] = ret_srchAbstract_array[j].toString();
                                    }
                                 }
                                 
                                if (conn != null)conn.close(); 
%>

得到了最終的文章列表,下面就是把他們顯示到前端;

<%
                               //如果搜索結果為空,證明沒搜到相關文章
                               if(ret_srchIDlist.size() == 0){
                                   out.println("<font>抱歉,沒有找到與 " + mykeyword + " 相關的結果 </font><br>"); 
                               }                              
                               else{ //循環輸出各個文章的標題和摘要                              
                                  for(int j = 0;j < 10 && j < n; j++){
                                    if(tmp_srchRet_id[j] != ""){
                                       out.println("<tr><tr><td><a href='kzkj_gywm.jsp?id=" + tmp_srchRet_id[j] + "'"); 
                                       //kzkj_gywm.jsp?id=tmp_srchRet_id[j]是對應文章的內容頁的鏈接
                                       out.println(" target='_blank'>"); 
                                       out.println("<font size='4'>" + tmp_srchRet_title[j] +"</font></a>"); 
                                        out.println("<font>" + tmp_srchRet_abstract[j] + "</font></td></tr><td>&nbsp;</td></tr>"); 
                                   }
                                 }
                             }
%>

這樣一個簡單的網站內部搜索引擎就實現了!

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM