search.jsp
来自「Lucene+nuctch一书的全部源码 测试源码 和几个简单的项目」· JSP 代码 · 共 264 行
JSP
264 行
<%@ page
session="false"
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
import="java.io.*"
import="java.util.*"
import="java.net.*"
import="org.apache.nutch.html.Entities"
import="org.apache.nutch.metadata.Nutch"
import="org.apache.nutch.searcher.*"
import="org.apache.nutch.plugin.*"
import="org.apache.nutch.clustering.*"
import="org.apache.hadoop.conf.*"
import="org.apache.nutch.util.NutchConfiguration"
%>
<% Configuration nutchConf = NutchConfiguration.get(application);
// 结果或者聚类的数量
int HITS_TO_CLUSTER = nutchConf.getInt("extension.clustering.hits-to-cluster", 100);
OnlineClusterer clusterer = null; // 聚类扩展
try {
clusterer = new OnlineClustererFactory(nutchConf).getOnlineClusterer();
} catch (PluginRuntimeException e) {
}
%>
<%--
<%@ include file="./refine-query-init.jsp" %>
--%>
<%
NutchBean bean = NutchBean.get(application, nutchConf);
request.setCharacterEncoding("UTF-8"); // 设定字符集
bean.LOG.info("query request from " + request.getRemoteAddr());
String queryString = request.getParameter("query"); // 根据输入构造查询参数
if (queryString == null)
queryString = "";
String htmlQueryString = Entities.encode(queryString);
boolean clusteringAvailable = (clusterer != null);
String clustering = "";
if (clusteringAvailable && "yes".equals(request.getParameter("clustering")))
clustering = "yes";
int start = 0; // 最先匹配结果
String startString = request.getParameter("start");
if (startString != null)
start = Integer.parseInt(startString);
int hitsPerPage = 10; // 每页显示数量
String hitsString = request.getParameter("hitsPerPage");
if (hitsString != null)
hitsPerPage = Integer.parseInt(hitsString);
int hitsPerSite = 2; // 每网站每页最大匹配数
String hitsPerSiteString = request.getParameter("hitsPerSite");
if (hitsPerSiteString != null)
hitsPerSite = Integer.parseInt(hitsPerSiteString);
String sort = request.getParameter("sort");
boolean reverse =
sort!=null && "true".equals(request.getParameter("reverse"));
String params = "&hitsPerPage="+hitsPerPage
+(sort==null ? "" : "&sort="+sort+(reverse?"&reverse=true":""));
int hitsToCluster = HITS_TO_CLUSTER; // 结果集中用于聚类的个数
String queryLang = request.getParameter("lang"); // 提取请求中的lang参数
if (queryLang == null) { queryLang = ""; }
Query query = Query.parse(queryString, queryLang, nutchConf);
bean.LOG.info("query: " + queryString);
bean.LOG.info("lang: " + queryLang);
String language =
ResourceBundle.getBundle("org.nutch.jsp.search", request.getLocale())
.getLocale().getLanguage();
String requestURI = HttpUtils.getRequestURL(request).toString();
String base = requestURI.substring(0, requestURI.lastIndexOf('/'));
String rss = "../opensearch?query="+htmlQueryString
+"&hitsPerSite="+hitsPerSite+"&lang="+queryLang+params;
%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%
out.flush();
%>
<%@ taglib uri="http://jakarta.apache.org/taglibs/i18n" prefix="i18n" %>
<i18n:bundle baseName="org.nutch.jsp.search"/>
<html lang="<%= language %>">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<head>
<title>Nutch: <i18n:message key="title"/></title>
<link rel="icon" href="img/favicon.ico" type="image/x-icon"/>
<link rel="shortcut icon" href="img/favicon.ico" type="image/x-icon"/>
<link rel="alternate" type="application/rss+xml" title="RSS" href="<%=rss%>"/>
<jsp:include page="include/style.html"/>
<base href="<%= base + "/" + language %>/">
<script type="text/javascript">
</script>
</head>
<body onLoad="queryfocus();">
<jsp:include page="<%= language + "/include/header.html"%>"/>
<form name="search" action="../search.jsp" method="get">
<input name="query" size=44 value="<%=htmlQueryString%>">
<input type="hidden" name="hitsPerPage" value="<%=hitsPerPage%>">
<input type="hidden" name="lang" value="<%=language%>">
<input type="submit" value="<i18n:message key="search"/>">
<% if (clusteringAvailable) { %>
<input id="clustbox" type="checkbox" name="clustering" value="yes"
<% if (clustering.equals("yes")) { %>CHECKED<% } %>>
<label for="clustbox"><i18n:message key="clustering"/></label>
<% } %>
<a href="help.html">help</a>
</form>
<%--
<%@ include file="./refine-query.jsp" %>
--%>
<%
int hitsToRetrieve = (clusteringAvailable && clustering.equals("yes") ? hitsToCluster : hitsPerPage);
if (clusteringAvailable && clustering.equals("yes")) {
bean.LOG.info("Clustering is on, hits to retrieve: " + hitsToRetrieve);
}
Hits hits;
try{
hits = bean.search(query, start + hitsToRetrieve, hitsPerSite, "site",
sort, reverse);
} catch (IOException e){
hits = new Hits(0,new Hit[0]);
}
int end = (int)Math.min(hits.getLength(), start + hitsPerPage);
int length = end-start;
int realEnd = (int)Math.min(hits.getLength(), start + hitsToRetrieve);
Hit[] show = hits.getHits(start, realEnd-start);
HitDetails[] details = bean.getDetails(show);
Summary[] summaries = bean.getSummary(details, query);
bean.LOG.info("total hits: " + hits.getTotal());
%>
<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>
<%
out.flush();
%>
<br><br>
<% if (clustering.equals("yes") && length != 0) { %>
<table border=0 cellspacing="3" cellpadding="0">
<tr>
<td valign="top">
<% } %>
<%
for (int i = 0; i < length; i++) { // display the hits
Hit hit = show[i];
HitDetails detail = details[i];
String title = detail.getValue("title");
String url = detail.getValue("url");
String id = "idx=" + hit.getIndexNo() + "&id=" + hit.getIndexDocNo();
String summary = summaries[i].toHtml(true);
String caching = detail.getValue("cache");
boolean showSummary = true;
boolean showCached = true;
if (caching != null) {
showSummary = !caching.equals(Nutch.CACHING_FORBIDDEN_ALL);
showCached = !caching.equals(Nutch.CACHING_FORBIDDEN_NONE);
}
if (title == null || title.equals("")) { // use url for docs w/o title
title = url;
}
%>
<b><a href="<%=url%>"><%=Entities.encode(title)%></a></b>
<%@ include file="more.jsp" %>
<% if (!"".equals(summary) && showSummary) { %>
<br><%=summary%>
<% } %>
<br>
<span class="url"><%=Entities.encode(url)%></span>
<%
if (showCached) {
%>(<a href="../cached.jsp?<%=id%>"><i18n:message key="cached"/></a>) <%
}
%>
(<a href="../explain.jsp?<%=id%>&query=<%=URLEncoder.encode(queryString, "UTF-8")%>&lang=<%=queryLang%>"><i18n:message key="explain"/></a>)
(<a href="../anchors.jsp?<%=id%>"><i18n:message key="anchors"/></a>)
<% if (hit.moreFromDupExcluded()) {
String more =
"query="+URLEncoder.encode("site:"+hit.getDedupValue()+" "+queryString, "UTF8")
+params+"&hitsPerSite="+0
+"&lang="+queryLang
+"&clustering="+clustering;%>
(<a href="../search.jsp?<%=more%>"><i18n:message key="moreFrom"/>
<%=hit.getDedupValue()%></a>)
<% } %>
<br><br>
<% } %>
<% if (clustering.equals("yes") && length != 0) { %>
</td>
<!-- clusters -->
<td style="border-right: 1px dotted gray;" /> </td>
<td align="left" valign="top" width="25%">
<%@ include file="cluster.jsp" %>
</td>
</tr>
</table>
<% } %>
<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="prev">
<%} %>
</form>
<%
int startnum=1; // 设置起始页面编号,每屏共10页
if((int)(start/hitsPerPage)>=5) // 计算起始页面编号新编号
startnum=(int)(start/hitsPerPage)-4;
for(int i=hitsPerPage*(startnum-1),j=0;i<=hits.getTotal()&&j<=10;)
{ // 循环构造翻页访问地址
%>
<td>
<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%>">
<a href="../search.jsp?query=<%=URLEncoder.encode(queryString, "UTF-8")%>&lang=zh&start=<%=i%>&hitsPerPage=<%=hitsPerPage%>&hitsPerSite=<%=hitsPerSite%>&&clustering="> <%=i/hitsPerPage + 1 %>
</form>
</td>
<%
i=i+10;
j++;
}
%>
<td>
<%
if ((hits.totalIsExact() && end < hits.getTotal()) // 向后翻页
|| (!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>
<table bgcolor="3333ff" align="right">
<tr><td bgcolor="ff9900"><a href="<%=rss%>"><font color="ffffff"><b>RSS</b>
</font></a></td></tr>
</table>
<p>
<a href="http://wiki.apache.org/nutch/FAQ">
<img border="0" src="../img/poweredbynutch_01.gif">
</a>
<jsp:include page="/include/footer.html"/>
</body>
</html>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?