search.jsp revision 144
fa9e4066f08beec538e775443c5be79dd423fcabahrensCDDL HEADER START
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.
fa9e4066f08beec538e775443c5be79dd423fcabahrensSee LICENSE.txt included in this distribution for the specific
fa9e4066f08beec538e775443c5be79dd423fcabahrenslanguage governing permissions and limitations under the License.
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]
fa9e4066f08beec538e775443c5be79dd423fcabahrensCDDL HEADER END
fa9e4066f08beec538e775443c5be79dd423fcabahrensCopyright 2005 Sun Microsystems, Inc. All rights reserved.
fa9e4066f08beec538e775443c5be79dd423fcabahrensUse is subject to license terms.
cde58dbc6a23d4d38db7c8866312be83221c765fMatthew Ahrensident "%Z%%M% %I% %E% SMI"
fa9e4066f08beec538e775443c5be79dd423fcabahrens--%><%@ page import = "javax.servlet.*,
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<%@ include file="projects.jspf" %>
b24ab6762772a3f6a89393947930c7fa61306783Jeff BonwickString sort = null;
fa9e4066f08beec538e775443c5be79dd423fcabahrensfinal String LASTMODTIME = "lastmodtime";
fa9e4066f08beec538e775443c5be79dd423fcabahrensfinal String RELEVANCY = "relevancy";
fa9e4066f08beec538e775443c5be79dd423fcabahrensCookie[] cookies = request.getCookies();
fa9e4066f08beec538e775443c5be79dd423fcabahrensif (cookies != null) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (Cookie cookie : cookies) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (!LASTMODTIME.equals(sort) && !RELEVANCY.equals(sort)) {
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick sort = null;
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;
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (sort != null) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens Cookie cookie = new Cookie("OpenGrok/sorting", sort);
fa9e4066f08beec538e775443c5be79dd423fcabahrensHits hits = null;
fa9e4066f08beec538e775443c5be79dd423fcabahrensString errorMsg = null;
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 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 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 String DATA_ROOT = env.getDataRootPath();
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick throw new Exception("DATA_ROOT parameter is not configured in web.xml!");
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick File data_root = new File(DATA_ROOT);
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick throw new Exception("DATA_ROOT parameter in web.xml does not exist or is not a directory!");
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick ireader = IndexReader.open(DATA_ROOT + "/index");
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick searcher = new IndexSearcher(ireader);
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick //String date = request.getParameter("date");
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 StringBuilder sb = new StringBuilder();
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick if (q != null) {
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick if (defs != null) {
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick if (refs != null) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (path != null) {
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick if (hist != null) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (project != null) {
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin boolean first = true;
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin for (String s : project.split(" ")) {
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin if (first) {
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin first = false;
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin sb.append("project:(");
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin QueryParser qparser = new QueryParser("full", analyzer);
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin qparser.setDefaultOperator(QueryParser.AND_OPERATOR);
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin qparser.setAllowLeadingWildcard(env.isAllowLeadingWildcard());
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick query = qparser.parse(qstr); //parse the
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ("lastmodtime".equals(sort)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens hits = searcher.search(query, new Sort("date", true));
fa9e4066f08beec538e775443c5be79dd423fcabahrens hits = searcher.search(query);
fa9e4066f08beec538e775443c5be79dd423fcabahrens thispage = max;
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());
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());
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin String pageTitle = "Search";
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin %><%@ include file="httpheader.jspf" %>
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 StringBuffer url = request.getRequestURL();
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin String querys = request.getQueryString();
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin if (querys != null) {
be6fd75a69ae679453d9cda5bff3326111e6d1caMatthew Ahrens int idx = querys.indexOf("sort=");
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin if (idx == -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (sort == null || RELEVANCY.equals(sort)) {
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick %><b>Sort by relevance</b> <a href="<%=url.toString()%>">Sort by last modified time</a><%
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick %><a href="<%=url.toString()%>">Sort by relevance</a> <b>Sort by last modified time</b><%
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin } %></td></tr></table>
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick<div id="menu">
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick <%@ include file="menu.jspf"%>
6e1f5caa9321646aa4212d48e32a0d241866d85dNeil Perrin<div id="results">
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 FSDirectory spellDirectory = FSDirectory.getDirectory(spellIndex);
44cd46cadd9aab751dae6a4023c1cb5bf316d274billm SpellChecker checker = new SpellChecker(spellDirectory);
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick Date sstart = new Date();
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> <%
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++) {
toks = defs.split("[\t ]+");
for(int j=0; j<toks.length; j++) {
String[] ret = checker.suggestSimilar(toks[j].toLowerCase(), 3);
for(int i = 0;i < ret.length; i++) {
%><p> Your search <b><%=query.toString()%></b> did not match any files.
if ( max < hits.length()) {
if((start + max) < hits.length()) {
thispage = hits.length() - start;
String url = (q == null ? "" : "&q=" + Util.URIEncode(q) ) +
(defs == null ? "" : "&defs=" + Util.URIEncode(defs)) +
(refs == null ? "" : "&refs=" + Util.URIEncode(refs)) +
(path == null ? "" : "&path=" + Util.URIEncode(path)) +
(hist == null ? "" : "&hist=" + Util.URIEncode(hist)) +
(sort == null ? "" : "&sort=" + Util.URIEncode(sort));
labelStart = sstart/max + 1;
for(int i=sstart; i<hits.length() && label <= labelEnd; i+= max) {
slider.append("<span class=\"sel\">" + label + "</span>");
} else if(label == labelEnd && i < hits.length()) {
arr = label < 10 ? " " + label : String.valueOf(label);
slider.append("<a class=\"more\" href=\"search?n=" + max + "&start=" + i + url + "\">"+
thispage = hits.length() - start; // set the max index to max or last
%> 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>
Results.prettyPrintHTML(hits, start, start+thispage,
ef.close();
<b> Completed in <%=(new Date()).getTime() - starttime.getTime()%> milliseconds </b> <br/>
%><br/></div><%@include file="foot.jspf"%><%