Nutch 二次开发需要修改的东西

本文详细介绍了Nutch搜索引擎的二次开发过程,包括修改界面显示、调整摘要长度、解决乱码问题、实现完整的分页功能、高亮显示关键词等内容。

nutch 里的页面,是通过xslt 里编写的,在源码src/web/style/nutch-page.xsl 编写,这里有一个xsl格式的源码。这里你应该要读懂它的基本结构,不然会build.xml失败的。指明了一些文件的位置,可以很方便的在此进行修改。参考该文

[xhtml]  view plain copy
  1. <!-- page title -->  
  2.         <title>  
  3.           <xsl:text>Nutch: </xsl:text>  
  4.           <xsl:value-of select="title" disable-output-escaping="yes"/>  
  5.         </title>  
  6. <!-- insert style -->  
  7.         <xsl:copy-of select="document('../include/style.html')"/>  
  8. <!-- specify icon file -->  
  9.       <link rel="icon" href="../img/favicon.ico" mce_href="img/favicon.ico" type="image/x-icon"/>  
  10.       <link rel="shortcut icon" href="../img/favicon.ico" mce_href="img/favicon.ico" type="image/x-icon"/>  

 

Nutch的默认选项保存在default.xml文件中,如果要进行修改的话在nutch-site.xml文件中重写一下即可。

 

在二次开发的时候,需要重点对Nutch的界面及界面显示数据进行适当的调整。

目前据我了解到的要修改的地方有以下几点:

1. 搜索页面页头页尾logo修改、选项卡乱码显示问题。
2. 显示查询结果行   添加查询用时
3. 查询结果摘要长度修改,默认只有20个字符。
4. 网页快照乱码修改,以及后面的(评分详解) (anchors) (more from news.qq.com)菜单项修改。
5. show all hits修改
6. 分页功能修改,源码只有下一页功能。
7. 文本高亮显示。

8. 摘要前的“...”

9. Nutch1.2 标题关键字高亮显示  试了没成功

1.右上角选项卡乱码问题

右上角“简介”、“常见问题”在搜索主界面不乱吗,但搜索时乱码的问题

修改 Tomcat 7.0/webapps/nutch-1.2/zh/header.html 的编码为GBK

<?xml version="1.0" encoding="GBK"?>

logo替换

把对应图片替换掉即可

Tomcat 7.0/webapps/nutch-1.2/img/reiter/logo_nutch.gif

Tomcat 7.0/webapps/nutch-1.2/img/poweredbynutch_01.gif

 

2. 查询结果行,计算查询用时

貌似系统已经提供了查询结果行,就是这样一句话 “第1-10 项 (共有 40 项查询结果)”

 

计算查询用时:

(1)在搜索开始之前,比如import语句区域后面,记录一下当前时间

<% 
//搜索用时计算
long startTime=System.currentTimeMillis();   //获取开始时间  
%>

(2)在搜索结束之后,比如RSS语句之前,记录一下当前时间

<%
long endTime=System.currentTimeMillis(); //获取结束时间 
%>

(3)两者相减,得到查询所用时间,单位为ms

<p>搜索用时:<%= endTime-startTime %> ms</p>

 

自定义查询提示,包括搜索结果数、当前页码、搜索时间

(1)删除这段代码,这段代码是系统自带的搜索结果提示

注:i18n即java的internationalization问题,即使java同时支持多种语言,对我国这种非英语国家且汉字有多种编码方式的情况下很有现实意义。

[java]  view plain copy
  1. <i18n:message key="hits">  
  2.   <i18n:messageArg value="<%=new Long((end==0)?0:(start+1))%>"/>  
  3.   <i18n:messageArg value="<%=new Long(end)%>"/>  
  4.   <i18n:messageArg value="<%=new Long(hits.getTotal())%>"/>  
  5. </i18n:message>  

(2)在删除的这段代码处添加一个div,设置其id,以便于下面用JS脚本改变其内容

<div id="result-tips"></div>

(3)在搜索结束后用下面的JS脚本改变div的内容。下面的代码控件导致js格式有变化,自己改一下

[javascript]  view plain copy
  1. <mce:script language="javascript"><!--  
  2.     document.getElementById('result-tips').innerHTML="共约 <%=new Long(hits.getTotal())%> 条结果,当前第 <%=new Long((end==0)?0:(start/10+1))%> 页, 搜索用时 <%= endTime-startTime %> ms";  
  3. // --></mce:script>  

 

3. 改变摘要长度

在文件Tomcat 7.0/webapps/nutch-1.2/WEB-INF/classes/nutch-site.xml中,默认为20。
<configuration>
...

[xhtml]  view plain copy
  1. <property>  
  2.   <name>searcher.summary.length</name>  
  3.   <value>100</value>  
  4.   <description>  
  5.   The total number of terms to display in a hit summary.  
  6.   </description>  
  7. </property>  

...
</configuration>

修改后,重启Tomcat服务即可生效。

4.网页快照乱码问题

注:我的搜索结果中,有些快照中只有一个链接没有内容,有些有,可能抓取时超时没抓取到内容。

所谓网页快照及搜索引擎服务器端存储的网页副本。Nutch通过关键字进行搜索网页的时候,会查询出这个关键字对应的相关信息,比如:title、 url、content等等。通过URL可以链接到该URL对应的网页。而网页快照其实是Nutch爬虫爬取下来的网页内容。因此,当点击网页快照时,我们根据索引文档的ID,去索引出原网页内容。该源代码在查询服务系统中的 cache.jsp中,下面是相关代码:
Hit hit = new Hit(Integer.parseInt(request.getParameter("idx")),
                    request.getParameter("id"));
HitDetails details = bean.getDetails(hit);
….

String content = new String(bean.getContent(details));
另外还涉及到Nutch 网页快照的中文问题,中文时采用UTF-8取得内容就行了。
修改cached.jsp,把
content = new String( bean.getContent(details) );
改成
content = new String( bean.getContent(details) ,"utf-8"); 
如果需要对内容的显示方面做一些修改的话,通过该页面也可以修改。

修改后立即生效。

 

5.show all hits修改

(nutch默认的页面hits有重复,最后一页出现showallhits的按钮,原来还以为是底层抓取重复,后来才发现是网页上的问题。不知道hitsPerSite这个变量到底是起什么作用的,为啥还有个showallhits,解决方法如下)

在search.jsp中修改下面的语句

int hitsPerSite = 2;                            // max hits per site

int hitsPerSite = 0; // max hits per site

 

6.分页功能

默认情况下,搜索引擎Nutch在查询搜索结果时,只有下一页功能。主要是Nutch采用了“80/20”原则,即返回前面最相关的记录,而基本上的用户都不会去关心第三页以后的内容。

search.jsp文件中 下面的代码删掉

[xhtml]  view plain copy
  1. <%  
  2. if ((hits.totalIsExact() && end < hits.getTotal()) // more hits to show  
  3.     || (!hits.totalIsExact() && (hits.getLength() > start+hitsPerPage))) {  
  4. %>  
  5.     <form name="next" action="../search.jsp" method="get">  
  6.     <input type="hidden" name="query" value="<%=htmlQueryString%>">  
  7.     <input type="hidden" name="lang" value="<%=queryLang%>">  
  8.     <input type="hidden" name="start" value="<%=end%>">  
  9.     <input type="hidden" name="hitsPerPage" value="<%=hitsPerPage%>">  
  10.     <input type="hidden" name="hitsPerSite" value="<%=hitsPerSite%>">  
  11.     <input type="hidden" name="clustering" value="<%=clustering%>">  
  12.     <input type="submit" value="<i18n:message key="next"/>">  
  13. <% if (sort != null) { %>  
  14.     <input type="hidden" name="sort" value="<%=sort%>">  
  15.     <input type="hidden" name="reverse" value="<%=reverse%>">  
  16. <% } %>  
  17.     </form>  
  18. <%  
  19.     }  
  20. if ((!hits.totalIsExact() && (hits.getLength() <= start+hitsPerPage))) {  
  21. %>  
  22.     <form name="showAllHits" action="../search.jsp" method="get">  
  23.     <input type="hidden" name="query" value="<%=htmlQueryString%>">  
  24.     <input type="hidden" name="lang" value="<%=queryLang%>">  
  25.     <input type="hidden" name="hitsPerPage" value="<%=hitsPerPage%>">  
  26.     <input type="hidden" name="hitsPerSite" value="0">  
  27.     <input type="hidden" name="clustering" value="<%=clustering%>">  
  28.     <input type="submit" value="<i18n:message key="showAllHits"/>">  
  29. <% if (sort != null) { %>  
  30.     <input type="hidden" name="sort" value="<%=sort%>">  
  31.     <input type="hidden" name="reverse" value="<%=reverse%>">  
  32. <% } %>  
  33.     </form>  
  34. <%  
  35.     }  
  36. %>  

改为

[java]  view plain copy
  1. <%---------------------------------------------------%>  
  2. <table align="center">  
  3.    <tr>  
  4.        <td>  
  5.             <%  
  6.    // 显示上一页按钮  
  7.             if (start >= hitsPerPage)  
  8.             {  
  9.             %>  
  10.                     <form name="pre" action="../search.jsp" method="get">  
  11.                         <input type="hidden" name="query" value="<%=htmlQueryString%>">  
  12.                         <input type="hidden" name="lang" value="<%=queryLang%>">  
  13.                         <input type="hidden" name="start" value="<%=start - hitsPerPage%>">  
  14.                         <input type="hidden" name="hitsPerPage" value="<%=hitsPerPage%>">  
  15.                         <input type="hidden" name="hitsPerSite" value="<%=hitsPerSite%>">  
  16.                         <input type="hidden" name="clustering" value="<%=clustering%>">  
  17.                         <input type="submit" value="上一页">  
  18.            <%} %>  
  19.                     </form>  
  20.                      
  21.      <%  
  22.      //显示页码按钮  
  23.     int startnum=1;   
  24.     //页面中最前面的页码编号,我设定(满足)共10页,当页为第6页  
  25.     //若果结果大于等于11页,每次显示11个按钮,当前按钮在最中间,即第6个  
  26.     if((int)(start/hitsPerPage)>=5)  
  27.      startnum=(int)(start/hitsPerPage)-4;  
  28.     for(int i=hitsPerPage*(startnum-1),j=0;i<=hits.getTotal()&&j<=10;)  
  29.     {     
  30.     if(hits.getTotal()%10==0&&i==hits.getTotal()) break//搜索结果为整数的时候处理  
  31.      %>  
  32.      <td>  
  33.      <%=startnum%> && <%=hits.getTotal()%>  
  34.      <form name="next" action="../search.jsp" method="get">  
  35.      <input type="hidden" name="query" value="<%=htmlQueryString%>">  
  36.      <input type="hidden" name="lang" value="<%=queryLang%>">  
  37.      <input type="hidden" name="start" value="<%=i%>">  
  38.      <input type="hidden" name="hitsPerPage" value="<%=hitsPerPage%>">  
  39.      <input type="hidden" name="hitsPerSite" value="<%=hitsPerSite%>">  
  40.      <input type="hidden" name="clustering" value="<%=clustering%>">  
  41.      <input type="submit" value="<%=i/hitsPerPage+1 %>">  
  42.     </form>  
  43.     </td>  
  44.     <%  
  45.     i=i+10;  
  46.     j++;  
  47.     }//for  
  48.      %>  
  49.         <td>  
  50.         <%  
  51.   //显示下一页按钮  
  52.          if ((hits.totalIsExact() && end < hits.getTotal()) // more hits to show  
  53.               || (!hits.totalIsExact() && (hits.getLength() > start  + hitsPerPage))) {  
  54.          %>  
  55.                      
  56.     <form name="next" action="../search.jsp" method="get">  
  57.      <input type="hidden" name="query" value="<%=htmlQueryString%>">  
  58.      <input type="hidden" name="lang" value="<%=queryLang%>">  
  59.      <input type="hidden" name="start" value="<%=end%>">  
  60.      <input type="hidden" name="hitsPerPage" value="<%=hitsPerPage%>">  
  61.      <input type="hidden" name="hitsPerSite" value="<%=hitsPerSite%>">  
  62.      <input type="hidden" name="clustering" value="<%=clustering%>">  
  63.      <input type="submit" value="<i18n:message key="next"/>">  
  64.     </form>  
  65.          <%} %>  
  66.          </td>  
  67.      </tr>  
  68. </table>  
  69. <%---------------------------------------------------%>  

 

效果如图所示:

 

注:我对网上的代码进行了修改,添加了这样一句命令

if(hits.getTotal()%10==0&&i==hits.getTotal()) break; //搜索结果为整数的时候处理

否则出现这种情况:搜索结果显示有40项,下面却显示有5页,经分析是由于Hits中有重复。

 

7.高亮显示

注:默认的 CSS的highlight 属性为:

.highlight {
      font-weight    bold  ;
}

(1)网上给出的方法是修改类 org.apache.nutch.searcher.Summary,路径:nutch/src/java/org/apache/nutch/searcher

[java]  view plain copy
  1. public String toHtml(boolean encode) {  
  2.     Fragment fragment = null;  
  3.     StringBuffer buf = new StringBuffer();  
  4.     for (int i=0; i<fragments.size(); i++) {  
  5.       fragment = fragments.get(i);  
  6.       if (fragment.isHighlight()) {  
  7.         buf.append("<span class=/"highlight/">")  
  8.            .append(encode ? Entities.encode(fragment.getText())  
  9.                           : fragment.getText())  
  10.            .append("</span>");  
  11.       } else if (fragment.isEllipsis()) {  
  12.         buf.append("<span class=/"ellipsis/"> ... </span>");  
  13.       } else {  
  14.         buf.append(encode ? Entities.encode(fragment.getText())  
  15.                           : fragment.getText());  
  16.       }  
  17.     }  
  18.     return buf.toString();  
  19.   }  

修改 buf.append("<span class=/"highlight/">") 这一句即可改变高亮显示的状态,比如换换颜色 buf.append("<span style=/"color:red /" >")

 

但这种方式需要重新ant等,比较麻烦,本人想到一种更简单的方式。

(2)直接修改样式

CSS样式文件为Tomcat 7.0/webapps/nutch-1.2/include/style.html

直接修改.highlight的样式属性

.highlight {
  font-weight: bold;
  color:#ff0000;
}

 

8. 摘要前的“...”

有些摘要前面有“...”,这是nutch/src/java/org/apache/nutch/searcher/Summary.java中添加的分割句子的符号。在最前面很不好看,我采取子字符串的方式去除它。

“...”的源代码是<span class="ellipsis"> ... </span>

 

修改/Tomcat 7.0/webapps/nutch-1.2/search.jsp中的

[java]  view plain copy
  1. <% if (!"".equals(summary) && showSummary) {   
  2. %>  
  3.    <div class="summary-div"><%=summary%></div>  
  4.    <% } %>  

[java]  view plain copy
  1. <% if (!"".equals(summary) && showSummary) {   
  2.         if("<span".equals(summary.substring(0,5))){  
  3.     %>  
  4.             <div class="summary-div"><%=summary.substring(36)%></div>  
  5.     <%  
  6.         }else{  
  7.     %>  
  8.             <div class="summary-div"><%=summary%></div>  
  9.     <%  
  10.         }  
  11.     }   
  12.     %>  

 

 

参考:

1. nutch的分页,search.jsp修改

http://jingerjinger520.blog.163.com/blog/static/149305439201101153138548/

 

2.关于nutch1.0二次开发需要更改的东西

http://dev.firnow.com/course/3_program/java/javajs/20100719/462098.html

 

3.Nutch二次开发总结

百度文库 http://wenku.baidu.com/view/a5f42a0abb68a98271fefa0c.htm

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值