Hi Marco

I thinks this is what you want. Still some known bugs there, but hope
it will helps or bright you;)

Regards
/Jack


On Apr 7, 2005 8:42 AM, [EMAIL PROTECTED] <[EMAIL PROTECTED]> wrote:
> Hi!
> 
>   Does anybody know a code to insert into search.jsp to show the result pages 
> list the way that Google does?
>   I mean: instead of showing just "Next" button, it could show: "Previous 1 2 
> 3 4 5 6 7 8 9 10 Next" and so on
>   "Previous 11 12 13 14 15 16 17 18 19 20 21 Next".
> 
>  Thanks,
>  Marco
>
<%@ page 
  contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"

  import="javax.servlet.*"
  import="javax.servlet.http.*"
  import="java.io.*"
  import="java.util.*"
  import="java.net.*"

  import="org.apache.nutch.html.Entities"
  import="org.apache.nutch.searcher.*"
  import="org.apache.nutch.plugin.*"
  import="org.apache.nutch.clustering.*"
  import="org.apache.nutch.util.NutchConf"

%><%!
  // NOTE: Dawid Weiss
  // these are servlet's class variables. Merely to speed up access
  // to them (instead of referencing static objects).

  /**
   * Number of hits to retrieve and cluster if clustering extension is available
   * and clustering is on. By default, 100. Configurable via nutch-conf.xml.
   */
  private final static int HITS_TO_CLUSTER =
    NutchConf.get().getInt("extension.clustering.hits-to-cluster", 100);
  
  private static int supposedRange = 4;
  
  /**
   * An instance of the clustering extension, if available.
   */
  private static OnlineClusterer clusterer;

  static {
    try {
      clusterer = OnlineClustererFactory.getOnlineClusterer();
    } catch (PluginRuntimeException e) {
      // NOTE: Dawid Weiss
      // should we ignore plugin exceptions, or rethrow it? Rethrowing
      // it effectively prevents the servlet class from being loaded into
      // the JVM
    }
  }

%>

<%--
// Uncomment this to enable query refinement.
// Do the same to "refine-query.jsp" below.
<%@ include file="./refine-query-init.jsp" %>
--%>

<%
  NutchBean bean = NutchBean.get(application);
  // set the character encoding to use when interpreting request values 
  request.setCharacterEncoding("UTF-8");

  bean.LOG.info("query request from " + request.getRemoteAddr());

  // get query from request
  String queryString = request.getParameter("query");
  // patch for tomcat 4 for chinese
  queryString = new String(queryString.getBytes("ISO-8859-1"),"GBK");
  queryString = new String(queryString.getBytes("GBK"),"UTF-8");
  System.out.println("query string is " + queryString);
  
  if (queryString == null)
    queryString = "";
  String htmlQueryString = Entities.encode(queryString);

  // a flag to make the code cleaner a bit.
  boolean clusteringAvailable = (clusterer != null);

  String clustering = "";
  if (clusteringAvailable && "yes".equals(request.getParameter("clustering")))
    clustering = "yes";

  int start = 0;          // first hit to display
  String startString = request.getParameter("start");
  if (startString != null)
    start = Integer.parseInt(startString);

  int hitsPerPage = 5;          // number of hits to display
  String hitsString = request.getParameter("hitsPerPage");
  if (hitsString != null)
    hitsPerPage = Integer.parseInt(hitsString);

  //int hitsPerSite = 3;                            // max hits per site
  int hitsPerSite = 0;
  String hitsPerSiteString = request.getParameter("hitsPerSite");
  if (hitsPerSiteString != null)
    hitsPerSite = Integer.parseInt(hitsPerSiteString);

  int hitsToCluster = HITS_TO_CLUSTER;            // number of hits to cluster

  Query query = Query.parse(queryString);
  bean.LOG.info("query: " + queryString);

  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('/'));

%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%
  // To prevent the character encoding declared with 'contentType' page
  // directive from being overriden by JSTL (apache i18n), we freeze it
  // by flushing the output buffer. 
  // see http://java.sun.com/developer/technicalArticles/Intl/MultilingualJSP/
  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"/>
<jsp:include page="/include/style.html"/>
<base href="<%= base  + "/" + language %>/">
</head>

<body>

<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="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>
 <% } %>
 </form>

<%--
// Uncomment this to enable query refinement.
// Do the same to "refine-query-init.jsp" above.
<%@ include file="./refine-query.jsp" %>
--%>

<%
   // how many hits to retrieve? if clustering is on and available,
   // take "hitsToCluster", otherwise just get hitsPerPage
   int hitsToRetrieve = (clusteringAvailable && clustering.equals("yes") ? 
hitsToCluster : hitsPerPage);

   if (clusteringAvailable && clustering.equals("yes")) {
     bean.LOG.info("Clustering is on, hits to retrieve: " + hitsToRetrieve);
   }

   // perform query
    // NOTE by Dawid Weiss:
    // The 'clustering' window actually moves with the start
    // position.... this is good, bad?... ugly?....
   Hits hits = bean.search(query, start + hitsToRetrieve, hitsPerSite);
   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);
   String[] 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>

<%
// be responsive
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 summary = summaries[i];
    String id = "idx=" + hit.getIndexNo() + "&id=" + hit.getIndexDocNo();

    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)) { %>
    <br><%=summary%>
    <% } %>
    <br>
    <span class="url"><%=Entities.encode(url)%></span>
    (<a href="../cached.jsp?<%=id%>"><i18n:message key="cached"/></a>)
    <%
      //queryString = new String(queryString.getBytes("UTF-8"),"GBK");
          //queryString = new String(queryString.getBytes("GBK"),"ISO-8859-1");
    %>
    (<a 
href="../explain.jsp?<%=id%>&query=<%=URLEncoder.encode(queryString,"UTF-8")%>"><i18n:message
 key="explain"/></a>)
    (<a href="../anchors.jsp?<%=id%>"><i18n:message key="anchors"/></a>)
    <% if (hit.moreFromSiteExcluded()) {
    String more =
    "query="+URLEncoder.encode("site:"+hit.getSite()+" "+queryString)
    +"&start="+start+"&hitsPerPage="+hitsPerPage+"&hitsPerSite="+0
    +"&clustering="+clustering;%>
    (<a href="../search.jsp?<%=more%>"><i18n:message key="moreFrom"/>
     <%=hit.getSite()%></a>)
    <% } %>
    <br><br>
<% } %>

<% if (clustering.equals("yes") && length != 0) { %>

</td>

<!-- clusters -->
<td style="border-right: 1px dotted gray;" />&#160;</td>
<td align="left" valign="top" width="25%">
<%@ include file="./cluster.jsp" %>
</td>

</tr>
</table>

<% } %>

<%

if ((hits.totalIsExact() //&& end < hits.getTotal()) // more hits to show
    //|| (!hits.totalIsExact() && (hits.getLength() > start+hitsPerPage))) 
   )){
%>
        <%--
    <form name="search" action="<%= base %>/search.jsp" method="get">
    <input type="hidden" name="query" value="<%=htmlQueryString%>">
    <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>
    --%>
    <div id=result>
    <p>
        <%
                long curP = end/hitsPerPage + (end%hitsPerPage > 0 ? 1:0); // 
current page
                end = end % hitsPerPage > 0? (end/hitsPerPage + 1)*hitsPerPage 
: end; // end page
            long actualRange = hits.getTotal() / hitsPerPage + 
(hits.getTotal()%hitsPerPage > 0 ? 1: 0); 
                        long range = Math.min(supposedRange,actualRange);
                        int pivot = 1;  // pivot in the page navigation
                        int forward = 1; // the distance navigation window will 
move forward
                        
                        if(curP > range)
                                pivot = 
Integer.parseInt(request.getParameter("pivot")) + forward; //FIXME. some bugs 
here
        %>
                <b>Results Page:</b><br>
                
        <%if(curP > 1){%>
                <big><b><a 
href="../search.jsp?query=<%=htmlQueryString%>&start=<%=end - 2*hitsPerPage 
%>&hitsPerPage=<%=hitsPerPage%>&hitsPerSite=<%=hitsPerSite%>&clustering=<%=clustering%>&pivot=<%=pivot%>">Prev</a></b></big>&nbsp;
                <a href="../search.jsp?query=<%=htmlQueryString%>&start=<%=end- 
2*hitsPerPage 
%>&hitsPerPage=<%=hitsPerPage%>&hitsPerSite=<%=hitsPerSite%>&=<%=clustering%>&pivot=<%=pivot%>"><img
 src=../img/ar_prev.gif width=7 height=13 border=0 alt=""></a>&nbsp;
        <%}%>
                <%
                        long prevStart = 0;
                        long nextStart = 0;
                        for(int i=pivot; i< range + pivot; i++)
                        {
                                prevStart = end - (curP - i + 1) * hitsPerPage; 
// previouse
                                nextStart = end + (i - curP - 1) * hitsPerPage; 
 // next
                                
                                if( i < curP )
                                        out.println("<a 
href=\"../search.jsp?query=" + htmlQueryString + "&start=" + prevStart + 
"&hitsPerPage=" + hitsPerPage + "&hitsPerSite=" + hitsPerSite + "&clustering=" 
+ clustering + "&pivot="  + pivot + "\" title=\"Results " + (prevStart + 1) + " 
- " + (prevStart + hitsPerPage) + "\"> "+ i + "</a>&nbsp;");
                                else 
                                if( i == curP)
                                        out.println(i + "&nbsp;");
                                else
                                        out.println("<a 
href=\"../search.jsp?query=" + htmlQueryString + "&start=" + nextStart + 
"&hitsPerPage=" + hitsPerPage + "&hitsPerSite=" + hitsPerSite + "&clustering=" 
+ clustering + "&pivot="  + pivot + "\" title=\"Results " + (nextStart + 
hitsPerPage + 1) + " - " + (Math.min(nextStart + 2 * 
hitsPerPage,hits.getTotal())) + "\"> "+ i + "</a>&nbsp;");
                        }
                        
                %>
        <%if((end < hits.getTotal())){%>        
                <a 
href="../search.jsp?query=<%=htmlQueryString%>&start=<%=end%>&hitsPerPage=<%=hitsPerPage%>&hitsPerSite=<%=hitsPerSite%>&=<%=clustering%>"><img
 src=../img/ar_next.gif width=7 height=13 border=0 alt=""></a>&nbsp;
                <big><b><a 
href="../search.jsp?query=<%=htmlQueryString%>&start=<%=end%>&hitsPerPage=<%=hitsPerPage%>&hitsPerSite=<%=hitsPerSite%>&clustering=<%=clustering%>&pivot=<%=pivot%>">Next</a></b></big>
        <%}%>
        </p>
        </div>
<%
    } 

if ((!hits.totalIsExact() && (hits.getLength() <= start+hitsPerPage))) {
%>
    <form name="search" action="../search.jsp" method="get">
    <input type="hidden" name="query" value="<%=htmlQueryString%>">
    <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"/>">
    </form>
<%
    }
%>

<p>
<!--a href="http://www.nutch.org/";>
<img border="0" src="/img/poweredbynutch_01.gif">
</a-->

<jsp:include page="/include/footer.html"/>

</body>
</html>

Reply via email to