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

(原创,转载请注明)

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

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

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

时间: 2024-10-11 17:26:59

网站内部搜索引擎简单实现的相关文章

网站内部链接应该如何进行优化

当前越来越多的站长开始注重网站的内链优化,认为网站内链优化能够有效的提升用户的体验度,同时还能够为百度蜘蛛提供迅捷的爬行路线,进而提升对百度蜘蛛的支持力度.这种认识从本质上而言是没有问题的,可是很多站长却不能够做好内链工作,或者所做的内链优化工作不够科学,导致了网站并没有得到很好的优化. 因此让广大站长朋友们了解具体的内链优化工作应该如何做,如果将细节做好,就显得极为重要,而这也是本文研究的重点所在.下面就来具体分析一些优化网站内部链接的具体工作细节. 第一,网站地图是内链之源.很多站长并不能够

总结的一些网站利于搜索引擎优化的小常识及SEO优化

网站利于搜索引擎优化的小常识 1. 尽量用独立IP和空间原因:同IP下其他网站受罚,可能会对你站有影响.如果你的站和很多垃圾.色情站同在一个服务器,搜索引擎会喜欢吗? 2. 做不同内容网站时,避免使用二级域名和免费域名.原因:当主域名或其他二级域名被惩罚,会牵连你的站.而且搜索引擎会规定每个域名下的收录数 3. 以复合关键字作域名,都应该用短横线隔开.如:www.made-in-china.com原因:如果用www.madeinchina.com 搜索引擎会把madeinchina认为是一个词,

如何构件合理的网站内部链接

一.网站内部衔接树立,网站内部衔接对网站是非常主要的,他们传递pr值,每页都会有每页的关键字,在满意内部衔接的一起也要指向别的页面,协助搜素引擎极好的抓取,尤其在关键字方面,比如有个页面说的是中 搜网站建造,那么咱们就在这个文字上做上那个面页面的衔接,每页都要有相关查找,这么也是同样的理由,便利抓取,便利传递pr,更主要是便利用户阅读.还有即是每个页面最好都要有高度归纳的标签,阐明网站内容,别忘了,做上这个页的关键字衔接. 二.网站主页衔接的树立,网站主页是网站高度归纳的当地,也是权重最高的页面

网站入侵如此简单

原文地址:http://pastebin.com/raw.php?i=cRYvK4jb [需FQ] _ _ _ ____ _ _ | | | | __ _ ___| | __ | __ ) __ _ ___| | _| | | |_| |/ _` |/ __| |/ / | _ \ / _` |/ __| |/ / | | _ | (_| | (__| < | |_) | (_| | (__| <|_| |_| |_|\__,_|\___|_|\_\ |____/ \__,_|\___|_|\

C Sharp进行网站信息抽取与小型内部搜索引擎的讲解

1.网站信息抽取: 网站信息抽取的方法有很多,取其中主流的三种: webBrowser,httpwebrequest/webresponse,webclient 其中我们选取httpwebrequest/webresponse + htmlagilitypack作为实例去测试 httpwebrequest/webresponse使用post/get方式携带postData向服务器提出请求,从而经过一定处理返回动态网页的全部内容源代码 用上此方法的原因是普通加载动态网站的方式只会返回网页的基本框架

网站屏蔽搜索引擎的方法

有的时候我们的网站可能还在调试阶段,或者只对部分告知用户或内部人使用,可能不想让搜索引擎抓取我们的网站,以下介绍几种屏蔽搜索引擎的抓取: 1.在网站的根目录下创建robots.txt,添加内容: User-agent:*    Disallow:/ 禁止某一搜索引擎,如百度: User-agent:baiduspider  Disallow:/ 各大搜索引擎代号: google蜘蛛: googlebot 百度蜘蛛:baiduspider yahoo蜘蛛:slurp alexa蜘蛛:ia_arch

自助建站如何让网站被搜索引擎收录?

快速.高效.主动性强是当下流行的生活方式.人们越来越希望把主动权掌握在自己手中.而企业自助建站,可让企业.商家快速搭建官方网站,不满意即可随时登陆修改,自由度高,编辑性强,无需再因为修改一张图,更换一个栏目名,而时刻督促着第三方建站公司修改,效率更高.但是,选择自助建站,在日后的工作中又该如何实现网站搜索引擎收录呢? 下面,小编就为大家归纳了几条相关建议,仅供广大站长朋友们参考. 一.填充网站内容,注意更新频率 首先,网站上线前请确保每个栏目下有3-5篇文章,不要太多,也不要太少,这样可以给蜘蛛

SharePoint 2010 网站备份还原简单介绍

今天尝试了SharePoint2010网站的备份和还原,从网上搜一些文档看看,然后自己试试,感觉和2007的操作没什么太大的区别,跟大家分享下自己尝试的命令行方式和数据库的方式,2007自己常用的也是这两种方式. 1. 命令行的方式 在服务器端,所有程序 - Microsoft SharePoint 2010 Products - SharePoint 2010 Management Shell 确定 备份网站命令:backup-SPSite http://localhost:10086 -Pa

Angularjs切换网站配色模式简单示例2(切换body元素的class)

一个网站可以有多种配色方案,例如正常模式,夜间模式等. 简单示例一个通过点击toggle 按钮,切换body元素的class,达到切换配色模式的angularjs小app. 1. Live范例可以在以下Codepen网址查看: http://codepen.io/ChristyWang/pen/NPxNMx 2. Toggle button源代码由以下网站生成:https://proto.io/freebies/onoff/ 3. 主要文件有两个:index.html和main.css. ind