search.jsp revision 144
fa9e4066f08beec538e775443c5be79dd423fcabahrens<%--
fa9e4066f08beec538e775443c5be79dd423fcabahrensCDDL HEADER START
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensThe contents of this file are subject to the terms of the
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrockCommon Development and Distribution License (the "License").
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrockYou may not use this file except in compliance with the License.
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensSee LICENSE.txt included in this distribution for the specific
fa9e4066f08beec538e775443c5be79dd423fcabahrenslanguage governing permissions and limitations under the License.
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensWhen distributing Covered Code, include this CDDL HEADER in each
fa9e4066f08beec538e775443c5be79dd423fcabahrensfile and include the License file at LICENSE.txt.
fa9e4066f08beec538e775443c5be79dd423fcabahrensIf applicable, add the following below this CDDL HEADER, with the
fa9e4066f08beec538e775443c5be79dd423fcabahrensfields enclosed by brackets "[]" replaced with your own identifying
fa9e4066f08beec538e775443c5be79dd423fcabahrensinformation: Portions Copyright [yyyy] [name of copyright owner]
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensCDDL HEADER END
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensCopyright 2005 Sun Microsystems, Inc. All rights reserved.
fa9e4066f08beec538e775443c5be79dd423fcabahrensUse is subject to license terms.
fa9e4066f08beec538e775443c5be79dd423fcabahrens
cde58dbc6a23d4d38db7c8866312be83221c765fMatthew Ahrensident "%Z%%M% %I% %E% SMI"
be6fd75a69ae679453d9cda5bff3326111e6d1caMatthew Ahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens--%><%@ page import = "javax.servlet.*,
fa9e4066f08beec538e775443c5be79dd423fcabahrensjava.lang.Integer,
fa9e4066f08beec538e775443c5be79dd423fcabahrensjavax.servlet.http.*,
fa9e4066f08beec538e775443c5be79dd423fcabahrensjava.util.Hashtable,
fa9e4066f08beec538e775443c5be79dd423fcabahrensjava.util.Vector,
fa9e4066f08beec538e775443c5be79dd423fcabahrensjava.util.Date,
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrinjava.util.ArrayList,
cde58dbc6a23d4d38db7c8866312be83221c765fMatthew Ahrensjava.util.List,
fa9e4066f08beec538e775443c5be79dd423fcabahrensjava.lang.*,
fa9e4066f08beec538e775443c5be79dd423fcabahrensjava.io.*,
fa9e4066f08beec538e775443c5be79dd423fcabahrensjava.io.StringReader,
fa9e4066f08beec538e775443c5be79dd423fcabahrensorg.opensolaris.opengrok.analysis.*,
fa9e4066f08beec538e775443c5be79dd423fcabahrensorg.opensolaris.opengrok.search.*,
fa9e4066f08beec538e775443c5be79dd423fcabahrensorg.opensolaris.opengrok.web.*,
fa9e4066f08beec538e775443c5be79dd423fcabahrensorg.opensolaris.opengrok.web.*,
fa9e4066f08beec538e775443c5be79dd423fcabahrensorg.opensolaris.opengrok.search.context.*,
fa9e4066f08beec538e775443c5be79dd423fcabahrensorg.opensolaris.opengrok.configuration.*,
fa9e4066f08beec538e775443c5be79dd423fcabahrensorg.apache.lucene.search.spell.LuceneDictionary,
fa9e4066f08beec538e775443c5be79dd423fcabahrensorg.apache.lucene.search.spell.SpellChecker,
fa9e4066f08beec538e775443c5be79dd423fcabahrensorg.apache.lucene.store.FSDirectory,
fa9e4066f08beec538e775443c5be79dd423fcabahrensorg.apache.lucene.analysis.*,
fa9e4066f08beec538e775443c5be79dd423fcabahrensorg.apache.lucene.document.*,
fa9e4066f08beec538e775443c5be79dd423fcabahrensorg.apache.lucene.index.*,
fa9e4066f08beec538e775443c5be79dd423fcabahrensorg.apache.lucene.search.*,
fa9e4066f08beec538e775443c5be79dd423fcabahrensorg.apache.lucene.queryParser.*"
fa9e4066f08beec538e775443c5be79dd423fcabahrens%><%@ page session="false" %><%@ page errorPage="error.jsp" %><%
fa9e4066f08beec538e775443c5be79dd423fcabahrensDate starttime = new Date();
fa9e4066f08beec538e775443c5be79dd423fcabahrensString q = request.getParameter("q");
fa9e4066f08beec538e775443c5be79dd423fcabahrensString defs = request.getParameter("defs");
fa9e4066f08beec538e775443c5be79dd423fcabahrensString refs = request.getParameter("refs");
b24ab6762772a3f6a89393947930c7fa61306783Jeff BonwickString hist = request.getParameter("hist");
b24ab6762772a3f6a89393947930c7fa61306783Jeff BonwickString path = request.getParameter("path");
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens%>
fa9e4066f08beec538e775443c5be79dd423fcabahrens<%@ include file="projects.jspf" %>
fa9e4066f08beec538e775443c5be79dd423fcabahrens<%
b24ab6762772a3f6a89393947930c7fa61306783Jeff BonwickString sort = null;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensfinal String LASTMODTIME = "lastmodtime";
fa9e4066f08beec538e775443c5be79dd423fcabahrensfinal String RELEVANCY = "relevancy";
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensCookie[] cookies = request.getCookies();
fa9e4066f08beec538e775443c5be79dd423fcabahrensif (cookies != null) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (Cookie cookie : cookies) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (cookie.getName().equals("OpenGrok/sorting")) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens sort = cookie.getValue();
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (!LASTMODTIME.equals(sort) && !RELEVANCY.equals(sort)) {
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick sort = null;
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick }
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick break;
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick }
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick }
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick}
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick
b24ab6762772a3f6a89393947930c7fa61306783Jeff BonwickString sortParam = request.getParameter("sort");
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwickif (sortParam != null) {
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin if (LASTMODTIME.equals(sortParam)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens sort = LASTMODTIME;
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else if (RELEVANCY.equals(sortParam)) {
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick sort = RELEVANCY;
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick }
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (sort != null) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens Cookie cookie = new Cookie("OpenGrok/sorting", sort);
fa9e4066f08beec538e775443c5be79dd423fcabahrens response.addCookie(cookie);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensHits hits = null;
fa9e4066f08beec538e775443c5be79dd423fcabahrensString errorMsg = null;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensif( q!= null && q.equals("")) q = null;
fa9e4066f08beec538e775443c5be79dd423fcabahrensif( defs != null && defs.equals("")) defs = null;
fa9e4066f08beec538e775443c5be79dd423fcabahrensif( refs != null && refs.equals("")) refs = null;
fa9e4066f08beec538e775443c5be79dd423fcabahrensif( hist != null && hist.equals("")) hist = null;
fa9e4066f08beec538e775443c5be79dd423fcabahrensif( path != null && path.equals("")) path = null;
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwickif (project != null && project.equals("")) project = null;
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwickif (q != null || defs != null || refs != null || hist != null || path != null) {
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick Searcher searcher = null; //the searcher used to open/search the index
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick IndexReader ireader = null; //the reader used to open/search the index
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick Query query = null, defQuery = null; //the Query created by the QueryParser
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick int start = 0; //the first index displayed on this page
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick int max = 25; //the maximum items displayed on this page
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick int thispage = 0; //used for the for/next either max or
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick String moreUrl = null;
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick CompatibleAnalyser analyzer = new CompatibleAnalyser();
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick String qstr = "";
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick String result = "";
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick try {
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick String DATA_ROOT = env.getDataRootPath();
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick if(DATA_ROOT.equals("")) {
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick throw new Exception("DATA_ROOT parameter is not configured in web.xml!");
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick }
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick File data_root = new File(DATA_ROOT);
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick if(!data_root.isDirectory()) {
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick throw new Exception("DATA_ROOT parameter in web.xml does not exist or is not a directory!");
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick }
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick ireader = IndexReader.open(DATA_ROOT + "/index");
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick searcher = new IndexSearcher(ireader);
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick //String date = request.getParameter("date");
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick try {
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick start = Integer.parseInt(request.getParameter("start")); //parse the max results first
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick max = Integer.parseInt(request.getParameter("n")); //then the start index
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick if(max < 0 || (max % 10 != 0) || max > 50) max = 25;
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick if(start < 0 ) start = 0;
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick } catch (Exception e) { }
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick StringBuilder sb = new StringBuilder();
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick if (q != null) {
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick sb.append(q);
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick }
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick if (defs != null) {
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick sb.append(" defs:(");
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick sb.append(defs);
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick sb.append(")");
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick }
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick if (refs != null) {
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick sb.append(" refs:(");
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick sb.append(refs);
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick sb.append(")");
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (path != null) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens sb.append(" path:(");
fa9e4066f08beec538e775443c5be79dd423fcabahrens sb.append(path);
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick sb.append(")");
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick if (hist != null) {
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick sb.append(" hist:(");
fa9e4066f08beec538e775443c5be79dd423fcabahrens sb.append(hist);
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin sb.append(")");
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (project != null) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens sb.append(" (");
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin boolean first = true;
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin for (String s : project.split(" ")) {
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin if (first) {
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin first = false;
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin } else {
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin sb.append(" OR ");
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin }
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin sb.append("project:(");
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin sb.append(s);
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin sb.append(")");
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin }
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin sb.append(")");
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick }
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick qstr = sb.toString();
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin QueryParser qparser = new QueryParser("full", analyzer);
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin qparser.setDefaultOperator(QueryParser.AND_OPERATOR);
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin qparser.setAllowLeadingWildcard(env.isAllowLeadingWildcard());
fa9e4066f08beec538e775443c5be79dd423fcabahrens
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick query = qparser.parse(qstr); //parse the
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ("lastmodtime".equals(sort)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens hits = searcher.search(query, new Sort("date", true));
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens hits = searcher.search(query);
22fe2c8844be88ebae6478ca1b0b92c8ec2aef54Jonathan Adams }
fa9e4066f08beec538e775443c5be79dd423fcabahrens thispage = max;
fa9e4066f08beec538e775443c5be79dd423fcabahrens } catch (BooleanQuery.TooManyClauses e) {
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick errorMsg = "<b>Error:</b> Too many results for wildcard!";
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick } catch (ParseException e) {
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick errorMsg = "<b>Error:</b><br/>" + Util.Htmlize(qstr) + "<br/>" + Util.Htmlize(e.getMessage());
22fe2c8844be88ebae6478ca1b0b92c8ec2aef54Jonathan Adams } catch (FileNotFoundException e) {
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick errorMsg = "<b>Error:</b> Index database not found";
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick } catch (Exception e) {
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick errorMsg = "<b>Error:</b> " + Util.Htmlize(e.getMessage());
22fe2c8844be88ebae6478ca1b0b92c8ec2aef54Jonathan Adams }
fa9e4066f08beec538e775443c5be79dd423fcabahrens // @TODO fix me. I should try to figure out where the exact hit is instead
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick // of returning a page with just _one_ entry in....
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (hits != null && hits.length() == 1 && request.getServletPath().equals("/s") && (query != null && query instanceof TermQuery)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens response.sendRedirect(context + "/xref" + hits.doc(0).get("path")
be6fd75a69ae679453d9cda5bff3326111e6d1caMatthew Ahrens + "#" + ((TermQuery)query).getTerm().text());
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin String pageTitle = "Search";
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin %><%@ include file="httpheader.jspf" %>
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin<body>
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin<div id="page">
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin <div id="header"><%@ include file="pageheader.jspf" %></div>
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin<div id="Masthead"></div>
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin<div id="bar">
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin <table border="0" width="100%"><tr><td><a href="<%=context%>" id="home">Home</a></td><td align="right"><%
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin {
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin StringBuffer url = request.getRequestURL();
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin url.append('?');
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin String querys = request.getQueryString();
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin if (querys != null) {
be6fd75a69ae679453d9cda5bff3326111e6d1caMatthew Ahrens int idx = querys.indexOf("sort=");
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin if (idx == -1) {
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin url.append(querys);
be6fd75a69ae679453d9cda5bff3326111e6d1caMatthew Ahrens url.append('&');
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin } else {
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin url.append(querys.substring(0, idx));
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin }
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin }
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin url.append("sort=");
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (sort == null || RELEVANCY.equals(sort)) {
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick url.append(LASTMODTIME);
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick %><b>Sort by relevance</b> <a href="<%=url.toString()%>">Sort by last modified time</a><%
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick } else {
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick url.append(RELEVANCY);
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick %><a href="<%=url.toString()%>">Sort by relevance</a> <b>Sort by last modified time</b><%
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick }
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin } %></td></tr></table>
fa9e4066f08beec538e775443c5be79dd423fcabahrens</div>
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick<div id="menu">
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick <%@ include file="menu.jspf"%>
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick</div>
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin<div id="results">
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin<%
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwickif( hits == null || errorMsg != null) {
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin %><%=errorMsg%><%
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick } else if (hits.length() == 0) {
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick File spellIndex = new File(env.getDataRootPath(), "spellIndex");
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (spellIndex.exists()) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens FSDirectory spellDirectory = FSDirectory.getDirectory(spellIndex);
44cd46cadd9aab751dae6a4023c1cb5bf316d274billm SpellChecker checker = new SpellChecker(spellDirectory);
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick Date sstart = new Date();
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens %><p><font color="#cc0000">Did you mean</font>:<%
fa9e4066f08beec538e775443c5be79dd423fcabahrens String[] toks;
22fe2c8844be88ebae6478ca1b0b92c8ec2aef54Jonathan Adams if(q != null) {
22fe2c8844be88ebae6478ca1b0b92c8ec2aef54Jonathan Adams toks = q.split("[\t ]+");
22fe2c8844be88ebae6478ca1b0b92c8ec2aef54Jonathan Adams if(toks != null){
22fe2c8844be88ebae6478ca1b0b92c8ec2aef54Jonathan Adams for(int j=0; j<toks.length; j++) {
22fe2c8844be88ebae6478ca1b0b92c8ec2aef54Jonathan Adams if(toks[j].length() > 3) {
22fe2c8844be88ebae6478ca1b0b92c8ec2aef54Jonathan Adams String[] ret = checker.suggestSimilar(toks[j].toLowerCase(), 3);
22fe2c8844be88ebae6478ca1b0b92c8ec2aef54Jonathan Adams for(int i = 0;i < ret.length; i++) {
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick %> <a href=search?q=<%=ret[i]%>><%=ret[i]%></a> &nbsp; <%
be6fd75a69ae679453d9cda5bff3326111e6d1caMatthew Ahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
22fe2c8844be88ebae6478ca1b0b92c8ec2aef54Jonathan Adams }
22fe2c8844be88ebae6478ca1b0b92c8ec2aef54Jonathan Adams }
22fe2c8844be88ebae6478ca1b0b92c8ec2aef54Jonathan Adams }
22fe2c8844be88ebae6478ca1b0b92c8ec2aef54Jonathan Adams if(refs != null) {
22fe2c8844be88ebae6478ca1b0b92c8ec2aef54Jonathan Adams toks = refs.split("[\t ]+");
22fe2c8844be88ebae6478ca1b0b92c8ec2aef54Jonathan Adams if(toks != null){
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock for(int j=0; j<toks.length; j++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if(toks[j].length() > 3) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens String[] ret = checker.suggestSimilar(toks[j].toLowerCase(), 3);
for(int i = 0;i < ret.length; i++) {
%> <a href=search?q=<%=ret[i]%>><%=ret[i]%></a> &nbsp; <%
}
}
}
}
}
if(defs != null) {
toks = defs.split("[\t ]+");
if(toks != null){
for(int j=0; j<toks.length; j++) {
if(toks[j].length() > 3) {
String[] ret = checker.suggestSimilar(toks[j].toLowerCase(), 3);
for(int i = 0;i < ret.length; i++) {
%> <a href=search?q=<%=ret[i]%>><%=ret[i]%></a> &nbsp; <%
}
}
}
}
}
spellDirectory.close();
%></p><%
}
%><p> Your search <b><%=query.toString()%></b> did not match any files.
<br />
Suggestions:<br/><blockquote>- Make sure all terms are spelled correctly.<br/>
- Try different keywords.<br/>
- Try more general keywords.<br/>
- Use 'wil*' cards if you are looking for partial match.
</blockquote>
</p><%
} else { // We have a lots of results to show
StringBuilder slider = null;
if ( max < hits.length()) {
if((start + max) < hits.length()) {
thispage = max;
} else {
thispage = hits.length() - start;
}
String url = (q == null ? "" : "&amp;q=" + Util.URIEncode(q) ) +
(defs == null ? "" : "&amp;defs=" + Util.URIEncode(defs)) +
(refs == null ? "" : "&amp;refs=" + Util.URIEncode(refs)) +
(path == null ? "" : "&amp;path=" + Util.URIEncode(path)) +
(hist == null ? "" : "&amp;hist=" + Util.URIEncode(hist)) +
(sort == null ? "" : "&amp;sort=" + Util.URIEncode(sort));
slider = new StringBuilder();
int labelStart =1;
int sstart = start - max* (start / max % 10 + 1) ;
if(sstart < 0) {
sstart = 0;
labelStart = 1;
} else {
labelStart = sstart/max + 1;
}
int label = labelStart;
int labelEnd = label + 11;
String arr;
for(int i=sstart; i<hits.length() && label <= labelEnd; i+= max) {
if (i <= start && start < i+ max) {
slider.append("<span class=\"sel\">" + label + "</span>");
} else {
if(label == labelStart && label != 1) {
arr = "&lt;&lt";
} else if(label == labelEnd && i < hits.length()) {
arr = "&gt;&gt;";
} else {
arr = label < 10 ? " " + label : String.valueOf(label);
}
slider.append("<a class=\"more\" href=\"search?n=" + max + "&amp;start=" + i + url + "\">"+
arr + "</a>");
}
label++;
}
} else {
thispage = hits.length() - start; // set the max index to max or last
}
%>&nbsp; &nbsp; Searched <b><%=query.toString()%></b> (Results <b><%=start+1%> -
<%=thispage+start%></b> of <b><%=hits.length()%></b>) sorted by <%=sort%> <p><%=slider != null ?
slider.toString(): ""%></p>
<table width="100%" cellpadding="3" cellspacing="0" border="0"><%
Context sourceContext = null;
Summarizer summer = null;
if (query != null) {
try{
sourceContext = new Context(query);
if(sourceContext != null)
summer = new Summarizer(query, analyzer);
} catch (Exception e) {
}
}
HistoryContext historyContext = null;
try {
historyContext = new HistoryContext(query);
} catch (Exception e) {
}
EftarFileReader ef = null;
try{
ef = new EftarFileReader(env.getDataRootPath() + "/index/dtags.eftar");
} catch (Exception e) {
}
Results.prettyPrintHTML(hits, start, start+thispage,
out,
sourceContext, historyContext, summer,
context + "/xref",
context + "/more",
env.getSourceRootPath(),
env.getDataRootPath(),
ef);
if(ef != null) {
try{
ef.close();
} catch (IOException e) {
}
}
%></table><br/>
<b> Completed in <%=(new Date()).getTime() - starttime.getTime()%> milliseconds </b> <br/>
<%=slider != null ? "<p>" + slider + "</p>" : ""%>
<%
}
%><br/></div><%@include file="foot.jspf"%><%
}
if (ireader != null)
ireader.close();
} else { // Entry page show the map
response.sendRedirect(context + "/index.jsp");
}
%>