• 网站内部搜索引擎简单实现


        (原创,转载请注明)

         不久前接手一个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>"); 
                                       }
                                     }
                                 }
    %>

    这样一个简单的网站内部搜索引擎就实现了!

  • 相关阅读:
    千拣万拣,拣个烂灯盏
    在JavaScript中控制链接的点击
    一条SQL语句
    Atlas与页面缓存冲突造成报错问题
    猴子他爹
    没有源代码也可以调试
    IC卡
    郭昶
    在js脚本中找到控件
    郭昶来到咱们学车场
  • 原文地址:https://www.cnblogs.com/McQueen1987/p/3843761.html
Copyright © 2020-2023  润新知