lucene整合struts2,搜索引擎的初步实现

xiaoxiao2026-06-09  9

构思时这样:采用3层架构

表示层:有3个jsp页面。

      1 (index.jsp):用来形成一个搜索的页面(大概弄成像google主页那种模式)

      2 (resutl.jsp):用来显示查询结果

      3 (product.jsp):用来显示产品的详细信息;

控制层:用struts2来实现,包括2个action。

      1 (search.action):用来对用户输入的信息查询,并转到result.jsp页面将查询结果返回。

      2 (product.action):用来实现产品详细信息的db查询,与转到product.jsp页面的返回。

持久层:jdbc实现产品信息的查询

index.jsp:

页面风格写成和Google差不多的样子,用post方式发送数据到后台,这里遇到了一个中文乱码问题,解决方法:

1:把index.jsp的pageEncoding 改成"gbk"

<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>

 

2:在webroot目录下创建struts.prpperties并写入:struts.i18n.enconing =gbk

或者在struts.xml中加入:<constant name="struts.i18n.encoding" value="gbk"></constant>

 

search.action

 

1:实现搜索功能

     1):获得页面传来的查询关键字

     2):使用lucene对传来的关键字查询,返回所有满足条件的product的id

     3):用id查询数据库返回所有product

     4):传递到result.jsp页面显示

2:实现result.jsp页面的分页功能:

1:策略:第一次返回10个结果,以后每次点击下一页或其他页码,将关键字和当前页码一起传到数据库,进行处理返回10条记录。

2:实现方法:新增size(每页显示多少条记录,10条)nowpage(现在时在第几页)pagesize(一共有多少分页)nextpage(下一页页码)

if((nowpage*10)<id_list.size() ) id_list = id_list.subList((nowpage-1)*10, nowpage*10); else id_list = id_list.subList((nowpage-1)*10, id_list.size());

 id_list为查询出的所有结果,上面的代码实现从查询出的结果中根据当前页码返回10条记录。

result.jsp

1:显示所有search.action post来的查询结果

2:实现分页 

 对于显示查询结果:采用struts2的遍历标签iterator,具体如下

<s:iterator value="p" status="s"> <table width="800" height="10" cellpadding="5"> <tr> <td> <s:a href="product.action?id=%{id}"> <font color="blue">${type } </font> </s:a> </td> </tr> <tr> <td> ${summary } </td> </tr> <tr> <td> <font color="green" size="2 "> nature url: <a href="<s:property value="originalUrl" />"> <s:property value="originalUrl" /> </a> </font> </td> </tr> </table> <hr size="2" color="lightblue"> </s:iterator>

 

 对于分页:采用jstl的循环标签 foreach,具体代码如下:

<c:forEach begin="1" end="${pagesize}" varStatus="vs"> <a href="search.action?infor=${infor}&&nowpage=${vs.count }" id="${vs.count }">${vs.count }</a> </c:forEach> <a href="search.action?infor=${infor}&& nowpage=${nextpage}" id="${nextpage}">下一页</a>

 对于分页还有一个问题,就是如何知道让用户知道现在时第几页的问题:这里采用ajax中的dwr框架重后台获得nowpage并把这个链接的字变成绿色,后来出现了个意外,就改用隐藏域方法,具体关键代码如下:

function load() { var hidden = dwr.util.getValue("hidden"); var str = "<font color='green' >"+hidden+"</font>"; document.getElementById(hidden).innerHTML=str; }

 

<body οnlοad="load()"> <input type="hidden" value=${nowpage } id="hidden" /> .....

  这样就实现了把当前页变成绿色。

product.action

1:获得reslut.jsp传递来的product id

2:根据id重db中取得product,并对其进行处理

3:转到product.jsp

对于第2 点要说明下,由于存入数据库是没有对汽车的详细参数处理,一股脑的存入了数据库,这里要通过字符串处理把车的参数分离出来具体代码

private void process(String str1, String str2, String str3) { StringBuffer sb = new StringBuffer(); String[] st_list = str1.split("\n"); // 获得 price sb .append("<table align='center' bordercolor='cadetblue' border='1' width='80%'><tr><td width='50%'><img src=" + this.p.getImageURI().trim() + "></td><td><img src='green.png'></td></tr><tr bgcolor='lightblue'><td>厂家估价:</td>"); sb.append("<td>" + str2 + "</td></tr>"); sb.append("<tr bgcolor='lightblue'><td >上市时间:</td><td>" + str3+ "</td></tr>"); // 获得其他详细参数 for (int i = 1; i < st_list.length; i++) { if (st_list[i].indexOf(";") != -1) { String[] st1_list = st_list[i].split(";"); for (int j = 0; j < st1_list.length; j++) { int beginIndex1 = st1_list[j].indexOf(":"); if (beginIndex1 != -1) { String index1 = st1_list[j].substring(0, beginIndex1); String content1 = st1_list[j] .substring(beginIndex1 + 1); sb.append("<tr bgcolor='cornsilk'><td>" + index1 + "</td>"); sb.append("<td>" + content1 + "</td>"); } else { sb.append("<tr><td>" + st1_list[j] + "</td>"); } } sb.append("</tr>"); } else if (st_list[i].indexOf(",") != -1) { String[] st2_list = st_list[i].split(","); for (int k = 0; k < st2_list.length; k += 2) { sb.append("<tr bgcolor='cornsilk'><td>" + st2_list[k] + "</td>"); if (k + 1 >= st2_list.length) break; sb.append("<td>" + st2_list[k + 1] + "</td>"); } sb.append("</tr>"); } else { sb.append("<tr><td bgcolor='lightblue'>" + st_list[i] + "</td></tr>"); } } sb.append("</table>"); contenthtml = sb.toString(); }

 

这样就实现了详细参数的处理

product.jsp

仅有显示的功能

 

这样就基本实现了一个简单搜索引擎,下一步就是对搜索引擎的美化和优化

转载请注明原文地址: https://www.6miu.com/read-5049854.html

最新回复(0)