博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
网站内部搜索引擎简单实现
阅读量:4985 次
发布时间:2019-06-12

本文共 8743 字,大约阅读时间需要 29 分钟。

    (原创,转载请注明)

     不久前接手一个java web开发的活,网站是一个学术期刊的发布和共享平台。支持在线搜索网站内部期刊。以前没接触过搜索引擎,觉得搜索是一门高深的学问,后来折腾了两天写了一个简单的,不包含权重排序、爬虫和大型数据库和全文搜索(貌似中文不支持全文搜索),不涉及自然语言处理相关的语义、分词等的搜索引擎。就是大概完成了搜索的大体流程,适合初学者了解搜索的大体步骤。

我的简单搜索引擎实现以下工作:

  1. 用户可根据标题、作者、关键字和全面检索,来搜寻相关期刊;
  2. 暂时只支持单个词的搜索,如果用户同时输入多个词进行搜索,比如“农业 大数据 可视化”,我是按一个字符串来处理,而非农业、大数据、可视化三个词进行处理;

          

     3. 由于中文不支持“全文检索”(要么就是支持但我没查到),我只能按照数据库的不同字段检索,得到的结果不分先后顺序(如果想提高准确率也可以做一个权重系统,权重高的排在前面);

     4. 如果用户选择“全面搜索”,那就分别检索表中各个字段,然后剔除检索结果中重复的部分;

     5. 根据关键字得到搜索结果,并在新的页面显示结果,新的页面参照百度的页面,比价简单;

     6. 项目很紧,好多东西没做,很多工作简化了,像翻页啊、排序啊、分词什么的都没做;

       

 

 

具体实现及代码如下:

index.jsp页面,搜索引擎前端代码:

1           
2
3
4
5
8
16
17
18
  
7
9 15

index.jsp页面,搜索引擎javascript代码:

这段代码把搜索框里的内容var keyname,和搜索类型var selectValue以url参数形式传递给search.jsp页面,在那里完成搜索和显示工作;

1 

 跳转到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("抱歉,没有找到与 " + mykeyword + " 相关的结果 
"); } else{ //循环输出各个文章的标题和摘要 for(int j = 0;j < 10 && j < n; j++){ if(tmp_srchRet_id[j] != ""){ out.println(""); out.println("" + tmp_srchRet_title[j] +""); out.println("" + tmp_srchRet_abstract[j] + " "); } } }%>

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

 

 

 

转载于:https://www.cnblogs.com/McQueen1987/p/3843761.html

你可能感兴趣的文章
Go单元测试与基准测试
查看>>
如何了解熟悉业务
查看>>
浅析回调函数和Schedule
查看>>
07黑盒测试方法
查看>>
小程序开放插件功能,可供其他小程序使用
查看>>
poj2398计算几何叉积
查看>>
lightoj1138
查看>>
HDU 3001 Travelling
查看>>
C++Primer读书笔记----第四章数组与指针(2)
查看>>
在iOS中使用Phonegap防止Webview被上下拖动
查看>>
50个必备的实用jQuery代码段
查看>>
wikioi--1044 拦截导弹
查看>>
Python 中的类与对象 初认识
查看>>
追逐学长的背影 - 2015年12月
查看>>
如何区分Python package
查看>>
vue-router重定向 不刷新问题
查看>>
反向传播算法1)
查看>>
crontab格式,命令
查看>>
P3097 [USACO13DEC]最优挤奶Optimal Milking
查看>>
[Groovy] List里的Inject方法
查看>>