nutch 里的页面,是通过xslt 里编写的,在源码src/web/style/nutch-page.xsl 编写,这里有一个xsl格式的源码。这里你应该要读懂它的基本结构,不然会build.xml失败的。指明了一些文件的位置,可以很方便的在此进行修改。参考该文
<!-- page title --> <title> <xsl:text>Nutch: </xsl:text> <xsl:value-of select="title" disable-output-escaping="yes"/> </title> <!-- insert style --> <xsl:copy-of select="document('../include/style.html')"/> <!-- specify icon file --> <link rel="icon" href="../img/favicon.ico" mce_href="img/favicon.ico" type="image/x-icon"/> <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同时支持多种语言,对我国这种非英语国家且汉字有多种编码方式的情况下很有现实意义。
<i18n:message key="hits"> <i18n:messageArg value="<%=new Long((end==0)?0:(start+1))%>"/> <i18n:messageArg value="<%=new Long(end)%>"/> <i18n:messageArg value="<%=new Long(hits.getTotal())%>"/> </i18n:message>
(2)在删除的这段代码处添加一个div,设置其id,以便于下面用JS脚本改变其内容
<div id="result-tips"></div>
(3)在搜索结束后用下面的JS脚本改变div的内容。下面的代码控件导致js格式有变化,自己改一下
<mce:script language="javascript"><!-- document.getElementById('result-tips').innerHTML="共约 <%=new Long(hits.getTotal())%> 条结果,当前第 <%=new Long((end==0)?0:(start/10+1))%> 页, 搜索用时 <%= endTime-startTime %> ms"; // --></mce:script>
3. 改变摘要长度
在文件Tomcat 7.0/webapps/nutch-1.2/WEB-INF/classes/nutch-site.xml中,默认为20。
<configuration>
...
<property> <name>searcher.summary.length</name> <value>100</value> <description> The total number of terms to display in a hit summary. </description> </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文件中 下面的代码删掉
<% if ((hits.totalIsExact() && end < hits.getTotal()) // more hits to show || (!hits.totalIsExact() && (hits.getLength() > start+hitsPerPage))) { %> <form name="next" action="../search.jsp" method="get"> <input type="hidden" name="query" value="<%=htmlQueryString%>"> <input type="hidden" name="lang" value="<%=queryLang%>"> <input type="hidden" name="start" value="<%=end%>"> <input type="hidden" name="hitsPerPage" value="<%=hitsPerPage%>"> <input type="hidden" name="hitsPerSite" value="<%=hitsPerSite%>"> <input type="hidden" name="clustering" value="<%=clustering%>"> <input type="submit" value="<i18n:message key="next"/>"> <% if (sort != null) { %> <input type="hidden" name="sort" value="<%=sort%>"> <input type="hidden" name="reverse" value="<%=reverse%>"> <% } %> </form> <% } if ((!hits.totalIsExact() && (hits.getLength() <= start+hitsPerPage))) { %> <form name="showAllHits" action="../search.jsp" method="get"> <input type="hidden" name="query" value="<%=htmlQueryString%>"> <input type="hidden" name="lang" value="<%=queryLang%>"> <input type="hidden" name="hitsPerPage" value="<%=hitsPerPage%>"> <input type="hidden" name="hitsPerSite" value="0"> <input type="hidden" name="clustering" value="<%=clustering%>"> <input type="submit" value="<i18n:message key="showAllHits"/>"> <% if (sort != null) { %> <input type="hidden" name="sort" value="<%=sort%>"> <input type="hidden" name="reverse" value="<%=reverse%>"> <% } %> </form> <% } %>
改为
<%---------------------------------------------------%> <table align="center"> <tr> <td> <% // 显示上一页按钮 if (start >= hitsPerPage) { %> <form name="pre" action="../search.jsp" method="get"> <input type="hidden" name="query" value="<%=htmlQueryString%>"> <input type="hidden" name="lang" value="<%=queryLang%>"> <input type="hidden" name="start" value="<%=start - hitsPerPage%>"> <input type="hidden" name="hitsPerPage" value="<%=hitsPerPage%>"> <input type="hidden" name="hitsPerSite" value="<%=hitsPerSite%>"> <input type="hidden" name="clustering" value="<%=clustering%>"> <input type="submit" value="上一页"> <%} %> </form> <% //显示页码按钮 int startnum=1; //页面中最前面的页码编号,我设定(满足)共10页,当页为第6页 //若果结果大于等于11页,每次显示11个按钮,当前按钮在最中间,即第6个 if((int)(start/hitsPerPage)>=5) startnum=(int)(start/hitsPerPage)-4; for(int i=hitsPerPage*(startnum-1),j=0;i<=hits.getTotal()&&j<=10;) { if(hits.getTotal()%10==0&&i==hits.getTotal()) break; //搜索结果为整数的时候处理 %> <td> <%=startnum%> && <%=hits.getTotal()%> <form name="next" action="../search.jsp" method="get"> <input type="hidden" name="query" value="<%=htmlQueryString%>"> <input type="hidden" name="lang" value="<%=queryLang%>"> <input type="hidden" name="start" value="<%=i%>"> <input type="hidden" name="hitsPerPage" value="<%=hitsPerPage%>"> <input type="hidden" name="hitsPerSite" value="<%=hitsPerSite%>"> <input type="hidden" name="clustering" value="<%=clustering%>"> <input type="submit" value="<%=i/hitsPerPage+1 %>"> </form> </td> <% i=i+10; j++; }//for %> <td> <% //显示下一页按钮 if ((hits.totalIsExact() && end < hits.getTotal()) // more hits to show || (!hits.totalIsExact() && (hits.getLength() > start + hitsPerPage))) { %> <form name="next" action="../search.jsp" method="get"> <input type="hidden" name="query" value="<%=htmlQueryString%>"> <input type="hidden" name="lang" value="<%=queryLang%>"> <input type="hidden" name="start" value="<%=end%>"> <input type="hidden" name="hitsPerPage" value="<%=hitsPerPage%>"> <input type="hidden" name="hitsPerSite" value="<%=hitsPerSite%>"> <input type="hidden" name="clustering" value="<%=clustering%>"> <input type="submit" value="<i18n:message key="next"/>"> </form> <%} %> </td> </tr> </table> <%---------------------------------------------------%>
效果如图所示:
注:我对网上的代码进行了修改,添加了这样一句命令
if(hits.getTotal()%10==0&&i==hits.getTotal()) break; //搜索结果为整数的时候处理
否则出现这种情况:搜索结果显示有40项,下面却显示有5页,经分析是由于Hits中有重复。
7.高亮显示
注:默认的 CSS的highlight 属性为:
(1)网上给出的方法是修改类 org.apache.nutch.searcher.Summary,路径:nutch/src/java/org/apache/nutch/searcher
public String toHtml(boolean encode) { Fragment fragment = null; StringBuffer buf = new StringBuffer(); for (int i=0; i<fragments.size(); i++) { fragment = fragments.get(i); if (fragment.isHighlight()) { buf.append("<span class=/"highlight/">") .append(encode ? Entities.encode(fragment.getText()) : fragment.getText()) .append("</span>"); } else if (fragment.isEllipsis()) { buf.append("<span class=/"ellipsis/"> ... </span>"); } else { buf.append(encode ? Entities.encode(fragment.getText()) : fragment.getText()); } } return buf.toString(); }
修改 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中的
<% if (!"".equals(summary) && showSummary) { %> <div class="summary-div"><%=summary%></div> <% } %>
为
<% if (!"".equals(summary) && showSummary) { if("<span".equals(summary.substring(0,5))){ %> <div class="summary-div"><%=summary.substring(36)%></div> <% }else{ %> <div class="summary-div"><%=summary%></div> <% } } %>
参考:
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.html