search.jsp revision 1164
e9458b1a7a19a63aa4c179f9ab20f4d50681c168Jens ElknerCDDL HEADER START
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel ManceThe contents of this file are subject to the terms of the
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel ManceCommon Development and Distribution License (the "License").
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel ManceYou may not use this file except in compliance with the License.
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel ManceSee LICENSE.txt included in this distribution for the specific
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel Mancelanguage governing permissions and limitations under the License.
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel ManceWhen distributing Covered Code, include this CDDL HEADER in each
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel Mancefile and include the License file at LICENSE.txt.
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel ManceIf applicable, add the following below this CDDL HEADER, with the
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mancefields enclosed by brackets "[]" replaced with your own identifying
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Manceinformation: Portions Copyright [yyyy] [name of copyright owner]
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel ManceCDDL HEADER END
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel ManceCopyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved.
1ea1794fe8bebbd2d807240f9ea9a7217f5fb75fChristian Maeder--%><%@ page import = "javax.servlet.*,
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Manceorg.opensolaris.opengrok.index.IndexDatabase,
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Manceorg.opensolaris.opengrok.search.context.*,
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Manceorg.opensolaris.opengrok.configuration.*,
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Manceorg.apache.lucene.search.spell.LuceneDictionary,
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Manceorg.apache.lucene.search.spell.SpellChecker,
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance%><%@ page session="false" %><%@ page errorPage="error.jsp" %><%--
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance--%><%@ include file="projects.jspf" %><%
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel ManceDate starttime = new Date();
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel ManceString defs = request.getParameter("defs");
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel ManceString refs = request.getParameter("refs");
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel ManceString hist = request.getParameter("hist");
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel ManceString path = request.getParameter("path");
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel ManceString sort = null;
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mancefinal String LASTMODTIME = "lastmodtime";
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mancefinal String RELEVANCY = "relevancy";
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mancefinal String BY_PATH = "fullpath";
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mancefinal SortField S_BY_PATH = new SortField(BY_PATH,SortField.STRING);
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel ManceCookie[] cookies = request.getCookies();
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Manceif (cookies != null) {
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance for (Cookie cookie : cookies) {
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance if (cookie.getName().equals("OpenGrokSorting")) {
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance if (!LASTMODTIME.equals(sort) && !RELEVANCY.equals(sort) && !BY_PATH.equals(sort)) {
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance sort = RELEVANCY;
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel ManceString sortParam = request.getParameter("sort");
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Manceif (sortParam != null) {
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance sort = LASTMODTIME;
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance } else if (RELEVANCY.equals(sortParam)) {
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance sort = RELEVANCY;
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance } else if (BY_PATH.equals(sortParam)) {
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance sort = BY_PATH;
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance if (sort != null) {
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance Cookie cookie = new Cookie("OpenGrokSorting", sort);
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance} else { sort = RELEVANCY; }
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance//List<org.apache.lucene.document.Document> docs=new ArrayList<org.apache.lucene.document.Document>();
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel ManceString errorMsg = null;
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Manceif( q!= null && q.equals("")) q = null;
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Manceif( defs != null && defs.equals("")) defs = null;
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Manceif( refs != null && refs.equals("")) refs = null;
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Manceif( hist != null && hist.equals("")) hist = null;
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Manceif( path != null && path.equals("")) path = null;
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Manceif (project != null && project.size()<1) project = null;
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Manceif (q != null || defs != null || refs != null || hist != null || path != null) {
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance Searcher searcher = null; //the searcher used to open/search the index
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance ScoreDoc[] hits = null; // list of documents which result from the query
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance Query query = null; //the Query created by the QueryBuilder
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance int totalHits=0;
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance int start = 0; //the first index displayed on this page
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance //TODO deprecate max this and merge with paging and param n - TEST needed
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance //int max = 25; //the maximum items displayed on this page
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance int max=RuntimeEnvironment.getInstance().getHitsPerPage();
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance int thispage = 0; //used for the for/next either max or
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance QueryBuilder queryBuilder =
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance new QueryBuilder()
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance .setFreetext(q).setDefs(defs).setRefs(refs)
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance .setPath(path).setHist(hist);
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance String DATA_ROOT = env.getDataRootPath();
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance throw new Exception("DATA_ROOT parameter is not configured in web.xml!");
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance File data_root = new File(DATA_ROOT);
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance throw new Exception("DATA_ROOT parameter in web.xml does not exist or is not a directory!");
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance //String date = request.getParameter("date");
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance start = Integer.parseInt(request.getParameter("start")); //parse the max results first
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance max = Integer.parseInt(request.getParameter("n")); //then the start index
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance if(max < 0 || (max % 10 != 0) || max > 50) max = 25;
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance if(start < 0 ) start = 0;
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance } catch (Exception e) { }
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance File root = new File(RuntimeEnvironment.getInstance().getDataRootFile(),
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance if (RuntimeEnvironment.getInstance().hasProjects()) {
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance if (project == null) {
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance errorMsg = "<b>Error:</b> You must select a project!";
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance if (project.size() > 1) { //more projects
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance IndexSearcher[] searchables = new IndexSearcher[project.size()];
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance File droot = new File(RuntimeEnvironment.getInstance().getDataRootFile(), "index");
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance //TODO might need to rewrite to Project instead of String , need changes in projects.jspf too
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance for (String proj : project) {
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance FSDirectory dir = FSDirectory.open(new File(droot, proj));
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance searchables[ii++] = new IndexSearcher(dir);
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance if (Runtime.getRuntime().availableProcessors() > 1) {
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance searcher = new ParallelMultiSearcher(searchables);
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance searcher = new MultiSearcher(searchables);
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance } else { // just 1 project selected
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance root = new File(root, project.get(0));
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance FSDirectory dir = FSDirectory.open(root);
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance searcher = new IndexSearcher(dir);
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance } else { //no project setup
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance FSDirectory dir = FSDirectory.open(root);
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance searcher = new IndexSearcher(dir);
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance //TODO check if below is somehow reusing sessions so we don't requery again and again, I guess 2min timeout sessions could be usefull, since you click on the next page within 2mins, if not, then wait ;)
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance if (errorMsg == null) {
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance sortf = new Sort(new SortField("date", SortField.STRING, true));
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance } else if (BY_PATH.equals(sort)) {
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance sortf = new Sort(S_BY_PATH);
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance TopFieldDocs fdocs = searcher.search(query, null, start + max, sortf);
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance thispage = max;
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance } catch (BooleanQuery.TooManyClauses e) {
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance errorMsg = "<b>Error:</b> Too many results for wildcard!";
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance } catch (ParseException e) {
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance errorMsg = "<b>Error parsing your query</b>" +
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance "<p/>You might try to enclose your search term in quotes, " +
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance "<a href=\"help.jsp#escaping\">escape special characters</a> " +
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance "with <b>\\</b>, or read the <a href=\"help.jsp\">Help</a> " +
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance "on the query language.<p/>" +
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance "Error message from parser:<br/>" + Util.htmlize(e.getMessage());
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance } catch (FileNotFoundException e) {
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance errorMsg = "<b>Error:</b> Index database not found";
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance } catch (Exception e) {
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance errorMsg = "<b>Error:</b> " + Util.htmlize(e.getMessage());
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance // Bug #3900: Check if this is a search for a single term, and that term
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance // is a definition. If that's the case, and we only have one match, we'll
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance // generate a direct link instead of a listing.
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance boolean isSingleDefinitionSearch =
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance (query instanceof TermQuery) && (defs != null);
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance // Attempt to create a direct link to the definition if we search for one
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance // single definition term AND we have exactly one match AND there is only
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance // one definition of that symbol in the document that matches.
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance boolean uniqueDefinition = false;
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance if (isSingleDefinitionSearch && hits != null && hits.length == 1) {
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance Document doc = searcher.doc(hits[0].doc);
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance if (doc.getFieldable("tags")!=null) {
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance byte[] rawTags = doc.getFieldable("tags").getBinaryValue();
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance Definitions tags = Definitions.deserialize(rawTags);
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance String symbol = ((TermQuery) query).getTerm().text();
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance if (tags.occurrences(symbol) == 1) {
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance uniqueDefinition = true;
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance // @TODO fix me. I should try to figure out where the exact hit is instead
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance // of returning a page with just _one_ entry in....
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance if (uniqueDefinition && request.getServletPath().equals(Constants.searchR)) {
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance String preFragmentPath = Util.URIEncodePath(context + Constants.xrefP + searcher.doc(hits[0].doc).get("path"));
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance String fragment = Util.URIEncode(((TermQuery)query).getTerm().text());
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance StringBuilder url = new StringBuilder(preFragmentPath);
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance String pageTitle = "Search";
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance RuntimeEnvironment environment = RuntimeEnvironment.getInstance();
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance %><%@ include file="httpheader.jspf" %>
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance<div id="page">
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance <div id="header"><%@ include file="pageheader.jspf" %></div>
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance<div id="Masthead"></div>
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance <table border="0" width="100%"><tr><td><a href="<%=context%>/" id="home">Home</a></td><td align="right"><%
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance String url = "search?";
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance url = url + (q == null ? "" : "&q=" + Util.URIEncode(q)) +
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance (defs == null ? "" : "&defs=" + Util.URIEncode(defs)) +
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance (refs == null ? "" : "&refs=" + Util.URIEncode(refs)) +
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance (path == null ? "" : "&path=" + Util.URIEncode(path)) +
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance (hist == null ? "" : "&hist=" + Util.URIEncode(hist));
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance if (hasProjects) {
668c9c725a11c0f77057152148570af853a1bc0dFelix Gabriel Mance if (project!=null) {
1ea1794fe8bebbd2d807240f9ea9a7217f5fb75fChristian Maeder url = url + "&project=";
668c9c725a11c0f77057152148570af853a1bc0dFelix Gabriel Mance for (Iterator it = project.iterator(); it.hasNext();) {
668c9c725a11c0f77057152148570af853a1bc0dFelix Gabriel Mance url = url + (project == null ? "" : Util.URIEncode((String) it.next()) + ",");
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance url=url+("&sort=");
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance if (sort == null || RELEVANCY.equals(sort)) {
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance %><b>relevance</b> | <a href="<%=url+LASTMODTIME%>">last modified time</a> | <a href="<%=url+BY_PATH%>">path</a><%
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance } else if (LASTMODTIME.equals(sort)) {
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance %><a href="<%=url+RELEVANCY%>">relevance</a> | <b>last modified time</b> | <a href="<%=url+BY_PATH%>">path</a><%
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance } else if (BY_PATH.equals(sort)) {
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance %><a href="<%=url+RELEVANCY%>">relevance</a> | <a href="<%=url+LASTMODTIME%>">last modified time</a> | <b>path</b><%
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance %><a href="<%=url+RELEVANCY%>">relevance</a> | <a href="<%=url+LASTMODTIME%>">last modified time</a> | <a href="<%=url+BY_PATH%>">path</a><%
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance } %></td></tr></table>
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance<div id="menu">
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance <%@ include file="menu.jspf"%>
6ea11cd5fb627d2fcd1b900c23fd3839c144a224Felix Gabriel Mance<div id="results">
//TODO spellchecking cycle below is not that great and we only create suggest links for every token in query, not for a query as whole
} else if (hits.length == 0) {
File spellIndex = new File(env.getDataRootPath(), "spellIndex");
if (RuntimeEnvironment.getInstance().hasProjects()) {
if (project.size() > 1) { //more projects
spellIndexes = new File[project.size()];
//TODO might need to rewrite to Project instead of String , need changes in projects.jspf too
spellIndex = new File(spellIndex, project.get(0));
if (spellIndexes!=null) {count=spellIndexes.length;}
if (spellIndex.exists()) {
FSDirectory spellDirectory = FSDirectory.open(spellIndex);
toks = q.split("[\t ]+");
for(int j=0; j<toks.length; j++) {
String[] ret = checker.suggestSimilar(toks[j].toLowerCase(), 5);
for(int i = 0;i < ret.length; i++) {
%><p><font color="#cc0000">Did you mean(for <%=spellIndex.getName()%>)</font>:<%
toks = refs.split("[\t ]+");
for(int j=0; j<toks.length; j++) {
String[] ret = checker.suggestSimilar(toks[j].toLowerCase(), 5);
for(int i = 0;i < ret.length; i++) {
%><p><font color="#cc0000">Did you mean(for <%=spellIndex.getName()%>)</font>:<%
//TODO it seems the only true spellchecker is for below field, see IndexDatabase createspellingsuggestions ...
toks = defs.split("[\t ]+");
for(int j=0; j<toks.length; j++) {
String[] ret = checker.suggestSimilar(toks[j].toLowerCase(), 5);
for(int i = 0;i < ret.length; i++) {
%><p><font color="#cc0000">Did you mean(for <%=spellIndex.getName()%>)</font>:<%
%><p> Your search <b><%=query.toString()%></b> did not match any files.
String urlp = (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;
slider.append("<span class=\"sel\">" + label + "</span>");
arr = label < 10 ? " " + label : String.valueOf(label);
slider.append("<a class=\"more\" href=\"s?n=" + max + "&start=" + i + urlp + "\">"+
%> Searched <b><%=query.toString()%></b> (Results <b><%=start+1%> -
slider.toString(): ""%></p>
new Context(query, queryBuilder.getQueries());
//TODO also fix the way what and how it is passed to prettyprint, can improve performance! SearchEngine integration is really needed here.
Results.prettyPrintHTML(searcher,hits, start, start+thispage,
ef.close();
<b> Completed in <%=(new Date()).getTime() - starttime.getTime()%> milliseconds </b> <br/>
%><br/></div><%@include file="foot.jspf"%><%