search.jsp revision 81a44287274541dbf3e208e0e42fda16571fac62
18ee6b6300fb11bb8798527f4c1f28823dc4d81aEric Ferraiuolo<%--
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke SmithCDDL HEADER START
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke SmithThe contents of this file are subject to the terms of the
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke SmithCommon Development and Distribution License (the "License").
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke SmithYou may not use this file except in compliance with the License.
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke SmithSee LICENSE.txt included in this distribution for the specific
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smithlanguage governing permissions and limitations under the License.
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke SmithWhen distributing Covered Code, include this CDDL HEADER in each
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smithfile and include the License file at LICENSE.txt.
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke SmithIf applicable, add the following below this CDDL HEADER, with the
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smithfields enclosed by brackets "[]" replaced with your own identifying
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smithinformation: Portions Copyright [yyyy] [name of copyright owner]
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke SmithCDDL HEADER END
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke SmithCopyright 2010 Sun Microsystems, Inc. All rights reserved.
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke SmithUse is subject to license terms.
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith--%><%@ page import = "javax.servlet.*,
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smithjava.lang.Integer,
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smithjavax.servlet.http.*,
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smithjava.util.Hashtable,
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smithjava.util.Vector,
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smithjava.util.Date,
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smithjava.util.ArrayList,
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smithjava.util.List,
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smithjava.lang.*,
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smithjava.io.*,
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smithjava.io.StringReader,
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smithorg.opensolaris.opengrok.analysis.*,
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smithorg.opensolaris.opengrok.index.IndexDatabase,
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smithorg.opensolaris.opengrok.search.*,
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smithorg.opensolaris.opengrok.web.*,
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smithorg.opensolaris.opengrok.search.context.*,
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smithorg.opensolaris.opengrok.search.SearchEngine,
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smithorg.opensolaris.opengrok.configuration.*,
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smithorg.apache.lucene.search.spell.LuceneDictionary,
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smithorg.apache.lucene.search.spell.SpellChecker,
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smithorg.apache.lucene.search.SortField,
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smithorg.apache.lucene.search.TopScoreDocCollector,
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smithorg.apache.lucene.store.FSDirectory,
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smithorg.apache.lucene.analysis.*,
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smithorg.apache.lucene.document.*,
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smithorg.apache.lucene.index.*,
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smithorg.apache.lucene.search.*,
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smithorg.apache.lucene.queryParser.*"
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith%><%@ page session="false" %><%@ page errorPage="error.jsp" %><%
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke SmithDate starttime = new Date();
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke SmithString q = request.getParameter("q");
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke SmithString defs = request.getParameter("defs");
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke SmithString refs = request.getParameter("refs");
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke SmithString hist = request.getParameter("hist");
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke SmithString path = request.getParameter("path");
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith%><%@ include file="projects.jspf" %><%
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke SmithString sort = null;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smithfinal String LASTMODTIME = "lastmodtime";
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smithfinal String RELEVANCY = "relevancy";
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smithfinal String BY_PATH = "fullpath";
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smithfinal SortField S_BY_PATH = new SortField(BY_PATH,SortField.STRING);
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke SmithCookie[] cookies = request.getCookies();
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smithif (cookies != null) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith for (Cookie cookie : cookies) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if (cookie.getName().equals("OpenGrok/sorting")) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith sort = cookie.getValue();
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if (!LASTMODTIME.equals(sort) && !RELEVANCY.equals(sort) && !BY_PATH.equals(sort)) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith sort = RELEVANCY;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith break;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith}
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke SmithString sortParam = request.getParameter("sort");
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smithif (sortParam != null) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if (LASTMODTIME.equals(sortParam)) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith sort = LASTMODTIME;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith } else if (RELEVANCY.equals(sortParam)) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith sort = RELEVANCY;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith } else if (BY_PATH.equals(sortParam)) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith sort = BY_PATH;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if (sort != null) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith Cookie cookie = new Cookie("OpenGrok/sorting", sort);
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith response.addCookie(cookie);
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith} else { sort = RELEVANCY; }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith//List<org.apache.lucene.document.Document> docs=new ArrayList<org.apache.lucene.document.Document>();
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke SmithString errorMsg = null;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smithif( q!= null && q.equals("")) q = null;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smithif( defs != null && defs.equals("")) defs = null;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smithif( refs != null && refs.equals("")) refs = null;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smithif( hist != null && hist.equals("")) hist = null;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smithif( path != null && path.equals("")) path = null;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smithif (project != null && project.size()<1) project = null;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smithif (q != null || defs != null || refs != null || hist != null || path != null) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith Searcher searcher = null; //the searcher used to open/search the index
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith TopScoreDocCollector collector=null; // the collector used
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith ScoreDoc[] hits = null; // list of documents which result from the query
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith IndexReader ireader = null; //the reader used to open/search the index
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith Query query = null, defQuery = null; //the Query created by the QueryParser
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith boolean allCollected=false;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith int totalHits=0;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith int start = 0; //the first index displayed on this page
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith //TODO deprecate max this and merge with paging and param n - TEST needed
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith //int max = 25; //the maximum items displayed on this page
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith int max=RuntimeEnvironment.getInstance().getHitsPerPage();
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith int hitsPerPage = RuntimeEnvironment.getInstance().getHitsPerPage();
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith int cachePages= RuntimeEnvironment.getInstance().getCachePages();
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith final boolean docsScoredInOrder=false;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith int thispage = 0; //used for the for/next either max or
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith QueryParser qparser = null;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith String qstr = "";
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith try {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith String DATA_ROOT = env.getDataRootPath();
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if(DATA_ROOT.equals("")) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith throw new Exception("DATA_ROOT parameter is not configured in web.xml!");
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith File data_root = new File(DATA_ROOT);
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if(!data_root.isDirectory()) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith throw new Exception("DATA_ROOT parameter in web.xml does not exist or is not a directory!");
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith //String date = request.getParameter("date");
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith try {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith //TODO merge paging hitsPerPage with parameter n (has to reflect the search if changed so proper number is cached first time)
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith start = Integer.parseInt(request.getParameter("start")); //parse the max results first
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith max = Integer.parseInt(request.getParameter("n")); //then the start index
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if(max < 0 || (max % 10 != 0) || max > 50) max = 25;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if(start < 0 ) start = 0;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith } catch (Exception e) { }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith qstr = Util.buildQueryString(q, defs, refs, path, hist);
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith qparser = SearchEngine.createQueryParser();
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith query = qparser.parse(qstr); //parse the
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith File root = new File(RuntimeEnvironment.getInstance().getDataRootFile(),
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith "index");
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if (RuntimeEnvironment.getInstance().hasProjects()) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if (project == null) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith errorMsg = "<b>Error:</b> You must select a project!";
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith } else {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if (project.size() > 1) { //more projects
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith IndexSearcher[] searchables = new IndexSearcher[project.size()];
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith File droot = new File(RuntimeEnvironment.getInstance().getDataRootFile(), "index");
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith int ii = 0;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith //TODO might need to rewrite to Project instead of String , need changes in projects.jspf too
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith for (String proj : project) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith ireader = (IndexReader.open(FSDirectory.open(new File(droot, proj)),true));
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith searchables[ii++] = new IndexSearcher(ireader);
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if (Runtime.getRuntime().availableProcessors() > 1) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith searcher = new ParallelMultiSearcher(searchables);
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith } else {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith searcher = new MultiSearcher(searchables);
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith } else { // just 1 project selected
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith root = new File(root, project.get(0));
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith ireader = IndexReader.open(FSDirectory.open(root),true);
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith searcher = new IndexSearcher(ireader);
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith } else { //no project setup
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith ireader = IndexReader.open(FSDirectory.open(root),true);
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith searcher = new IndexSearcher(ireader);
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith //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 ;)
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if (errorMsg == null) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith collector = TopScoreDocCollector.create(hitsPerPage*cachePages,docsScoredInOrder);
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if (LASTMODTIME.equals(sort)) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith Sort sortf = new Sort(new SortField("date",SortField.STRING,true));
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith TopFieldDocs fdocs=searcher.search(query, null,hitsPerPage*cachePages, sortf);
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith totalHits=fdocs.totalHits;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if (start>=hitsPerPage*cachePages && !allCollected) { //fetch ALL results only if above cachePages
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith fdocs=searcher.search(query, null, totalHits, sortf);
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith allCollected=true;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith hits = fdocs.scoreDocs;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith } else if (BY_PATH.equals(sort)) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith Sort sortf = new Sort(S_BY_PATH);
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith TopFieldDocs fdocs=searcher.search(query, null,hitsPerPage*cachePages, sortf);
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith totalHits=fdocs.totalHits;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if (start>=hitsPerPage*cachePages && !allCollected) { //fetch ALL results only if above cachePages
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith fdocs=searcher.search(query, null,totalHits, sortf);
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith allCollected=true;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith hits = fdocs.scoreDocs;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith } else {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith searcher.search(query,collector);
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith totalHits=collector.getTotalHits();
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if (start>=hitsPerPage*cachePages && !allCollected) { //fetch ALL results only if above cachePages
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith collector = TopScoreDocCollector.create(totalHits,docsScoredInOrder);
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith searcher.search(query,collector);
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith allCollected=true;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith hits=collector.topDocs().scoreDocs;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith //below will get all the documents
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith// for (int i = 0; i < hits.length; i++) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith// int docId = hits[i].doc;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith// Document d = searcher.doc(docId);
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith// docs.add(d);
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith// }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith thispage = max;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith } catch (BooleanQuery.TooManyClauses e) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith errorMsg = "<b>Error:</b> Too many results for wildcard!";
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith } catch (ParseException e) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith errorMsg = "<b>Error parsing your query:</b><br/>" + Util.htmlize(qstr) +
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith "<p/>You might try to enclose your search term in quotes: <br/>" +
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith "<a href=search?q=\"" + Util.URIEncode(qstr) + "\">\"" + Util.htmlize(qstr) +
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith "\"</a><p/> or read the <a href=\"help.jsp\">Help</a> on query language(eventually <a href=\"help.jsp#escaping\">escape special characters</a> with <b>\\</b>)<p/>" +
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith "Error message from parser:<br/>" + Util.htmlize(e.getMessage());
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith } catch (FileNotFoundException e) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith errorMsg = "<b>Error:</b> Index database not found";
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith } catch (Exception e) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith errorMsg = "<b>Error:</b> " + Util.htmlize(e.getMessage());
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith // Bug #3900: Check if this is a search for a single term, and that term
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith // is a definition. If that's the case, and we only have one match, we'll
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith // generate a direct link instead of a listing.
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith boolean isSingleDefinitionSearch =
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith (query instanceof TermQuery) && (defs != null);
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith // Attempt to create a direct link to the definition if we search for one
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith // single definition term AND we have exactly one match AND there is only
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith // one definition of that symbol in the document that matches.
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith boolean uniqueDefinition = false;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if (isSingleDefinitionSearch && hits != null && hits.length == 1) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith Document doc = searcher.doc(hits[0].doc);
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith byte[] rawTags = doc.getFieldable("tags").getBinaryValue();
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith Definitions tags = Definitions.deserialize(rawTags);
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith String symbol = ((TermQuery) query).getTerm().text();
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if (tags.occurrences(symbol) == 1) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith uniqueDefinition = true;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith // @TODO fix me. I should try to figure out where the exact hit is instead
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith // of returning a page with just _one_ entry in....
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if (uniqueDefinition && request.getServletPath().equals("/s")) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith String preFragmentPath = Util.URIEncodePath(context + "/xref" + searcher.doc(hits[0].doc).get("path"));
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith String fragment = Util.URIEncode(((TermQuery)query).getTerm().text());
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith StringBuilder url = new StringBuilder(preFragmentPath);
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith url.append("#");
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith url.append(fragment);
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith response.sendRedirect(url.toString());
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith } else {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith String pageTitle = "Search";
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith RuntimeEnvironment environment = RuntimeEnvironment.getInstance();
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith environment.register();
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith %><%@ include file="httpheader.jspf" %>
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith<body>
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith<div id="page">
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith <div id="header"><%@ include file="pageheader.jspf" %></div>
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith<div id="Masthead"></div>
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith<div id="bar">
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith <table border="0" width="100%"><tr><td><a href="<%=context%>" id="home">Home</a></td><td align="right"><%
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith String url = "search?";
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith url = url + (q == null ? "" : "&amp;q=" + Util.URIEncode(q)) +
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith (defs == null ? "" : "&amp;defs=" + Util.URIEncode(defs)) +
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith (refs == null ? "" : "&amp;refs=" + Util.URIEncode(refs)) +
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith (path == null ? "" : "&amp;path=" + Util.URIEncode(path)) +
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith (hist == null ? "" : "&amp;hist=" + Util.URIEncode(hist));
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if (hasProjects) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if (project!=null) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith url = url + "&amp;project=";
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith for (Iterator it = project.iterator(); it.hasNext();) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith url = url + (project == null ? "" : Util.URIEncode((String) it.next()) + ",");
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith %>Sort by: <%
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith url=url+("&amp;sort=");
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if (sort == null || RELEVANCY.equals(sort)) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith %><b>relevance</b> | <a href="<%=url+LASTMODTIME%>">last modified time</a> | <a href="<%=url+BY_PATH%>">path</a><%
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith } else if (LASTMODTIME.equals(sort)) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith %><a href="<%=url+RELEVANCY%>">relevance</a> | <b>last modified time</b> | <a href="<%=url+BY_PATH%>">path</a><%
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith } else if (BY_PATH.equals(sort)) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith %><a href="<%=url+RELEVANCY%>">relevance</a> | <a href="<%=url+LASTMODTIME%>">last modified time</a> | <b>path</b><%
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith } else {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith %><a href="<%=url+RELEVANCY%>">relevance</a> | <a href="<%=url+LASTMODTIME%>">last modified time</a> | <a href="<%=url+BY_PATH%>">path</a><%
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith } %></td></tr></table>
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith</div>
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith<div id="menu">
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith <%@ include file="menu.jspf"%>
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith</div>
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith<div id="results">
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith<%
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith//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
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smithif( hits == null || errorMsg != null) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith %><%=errorMsg%><%
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith } else if (hits.length == 0) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith File spellIndex = new File(env.getDataRootPath(), "spellIndex");
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith File[] spellIndexes=null;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if (RuntimeEnvironment.getInstance().hasProjects()) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if (project.size() > 1) { //more projects
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith spellIndexes = new File[project.size()];
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith int ii = 0;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith //TODO might need to rewrite to Project instead of String , need changes in projects.jspf too
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith for (String proj : project) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith spellIndexes[ii++] = new File(spellIndex,proj);
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith } else { // just 1 project selected
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith spellIndex = new File(spellIndex, project.get(0));
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith int count=1;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if (spellIndexes!=null) {count=spellIndexes.length;}
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith for (int idx = 0; idx < count; idx++) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if (spellIndexes!=null) spellIndex = spellIndexes[idx];
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if (spellIndex.exists()) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith FSDirectory spellDirectory = FSDirectory.open(spellIndex);
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith SpellChecker checker = new SpellChecker(spellDirectory);
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith Date sstart = new Date();
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith boolean printHeader = true;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith String[] toks;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if(q != null) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith toks = q.split("[\t ]+");
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if(toks != null){
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith for(int j=0; j<toks.length; j++) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if(toks[j].length() > 3) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith String[] ret = checker.suggestSimilar(toks[j].toLowerCase(), 5);
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith for(int i = 0;i < ret.length; i++) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if (printHeader) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith %><p><font color="#cc0000">Did you mean(for <%=spellIndex.getName()%>)</font>:<%
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith printHeader = false;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith %> <a href=search?q=<%=ret[i]%>><%=ret[i]%></a> &nbsp; <%
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if(refs != null) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith toks = refs.split("[\t ]+");
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if(toks != null){
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith for(int j=0; j<toks.length; j++) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if(toks[j].length() > 3) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith String[] ret = checker.suggestSimilar(toks[j].toLowerCase(), 5);
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith for(int i = 0;i < ret.length; i++) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if (printHeader) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith %><p><font color="#cc0000">Did you mean(for <%=spellIndex.getName()%>)</font>:<%
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith printHeader = false;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith %> <a href=search?refs=<%=ret[i]%>><%=ret[i]%></a> &nbsp; <%
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith //TODO it seems the only true spellchecker is for below field, see IndexDatabase createspellingsuggestions ...
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if(defs != null) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith toks = defs.split("[\t ]+");
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if(toks != null){
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith for(int j=0; j<toks.length; j++) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if(toks[j].length() > 3) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith String[] ret = checker.suggestSimilar(toks[j].toLowerCase(), 5);
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith for(int i = 0;i < ret.length; i++) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if (printHeader) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith %><p><font color="#cc0000">Did you mean(for <%=spellIndex.getName()%>)</font>:<%
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith printHeader = false;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith %> <a href=search?defs=<%=ret[i]%>><%=ret[i]%></a> &nbsp; <%
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if (printHeader) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith %></p><%
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith spellDirectory.close();
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith %><p> Your search <b><%=query.toString()%></b> did not match any files.
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith <br />
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith Suggestions:<br/><blockquote>- Make sure all terms are spelled correctly.<br/>
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith - Try different keywords.<br/>
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith - Try more general keywords.<br/>
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith - Use 'wil*' cards if you are looking for partial match.
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith </blockquote>
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith </p><%
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith } else { // We have a lots of results to show
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith StringBuilder slider = null;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if ( max < totalHits) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if((start + max) < totalHits) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith thispage = max;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith } else {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith thispage = totalHits - start;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith String urlp = (q == null ? "" : "&amp;q=" + Util.URIEncode(q)) +
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith (defs == null ? "" : "&amp;defs=" + Util.URIEncode(defs)) +
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith (refs == null ? "" : "&amp;refs=" + Util.URIEncode(refs)) +
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith (path == null ? "" : "&amp;path=" + Util.URIEncode(path)) +
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith (hist == null ? "" : "&amp;hist=" + Util.URIEncode(hist)) +
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith (sort == null ? "" : "&amp;sort=" + Util.URIEncode(sort));
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if (hasProjects) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith urlp = urlp + "&amp;project=";
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith for (Iterator it = project.iterator(); it.hasNext();) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith urlp = urlp + (project == null ? "" : Util.URIEncode((String) it.next()) + ",");
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith slider = new StringBuilder();
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith int labelStart =1;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith int sstart = start - max* (start / max % 10 + 1) ;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if(sstart < 0) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith sstart = 0;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith labelStart = 1;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith } else {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith labelStart = sstart/max + 1;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith int label = labelStart;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith int labelEnd = label + 11;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith String arr;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith for(int i=sstart; i<totalHits && label <= labelEnd; i+= max) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if (i <= start && start < i+ max) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith slider.append("<span class=\"sel\">" + label + "</span>");
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith } else {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if(label == labelStart && label != 1) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith arr = "&lt;&lt";
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith } else if(label == labelEnd && i < totalHits) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith arr = "&gt;&gt;";
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith } else {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith arr = label < 10 ? " " + label : String.valueOf(label);
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith slider.append("<a class=\"more\" href=\"s?n=" + max + "&amp;start=" + i + urlp + "\">"+
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith arr + "</a>");
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith label++;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith } else {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith thispage = totalHits - start; // set the max index to max or last
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith %>&nbsp; &nbsp; Searched <b><%=query.toString()%></b> (Results <b><%=start+1%> -
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith <%=thispage+start%></b> of <b><%=totalHits%></b>) sorted by <%=sort%> <p><%=slider != null ?
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith slider.toString(): ""%></p>
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith <table width="100%" cellpadding="3" cellspacing="0" border="0"><%
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith Context sourceContext = null;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith Summarizer summer = null;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if (query != null) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith try{
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith sourceContext = new Context(query);
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if(sourceContext != null)
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith summer = new Summarizer(query,
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith qparser.getAnalyzer());
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith } catch (Exception e) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
d9a962241dcb254b22c8aa6857f303c76644f80bJenny Donnelly
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith HistoryContext historyContext = null;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith try {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith historyContext = new HistoryContext(query);
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith } catch (Exception e) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith EftarFileReader ef = null;
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith try{
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith ef = new EftarFileReader(env.getDataRootPath() + "/index/dtags.eftar");
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith } catch (Exception e) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith //TODO also fix the way what and how it is passed to prettyprint, can improve performance! SearchEngine integration is really needed here.
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith Results.prettyPrintHTML(searcher,hits, start, start+thispage,
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith out,
709e496fcb1e2b445ec2836ecd4409c0700acd37Jenny Donnelly sourceContext, historyContext, summer,
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith context + "/xref",
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith context + "/more",
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith env.getSourceRootPath(),
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith env.getDataRootPath(),
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith ef);
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if(ef != null) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith try{
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith ef.close();
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith } catch (IOException e) {
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith %></table><br/>
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith <b> Completed in <%=(new Date()).getTime() - starttime.getTime()%> milliseconds </b> <br/>
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith <%=slider != null ? "<p>" + slider + "</p>" : ""%>
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith <%
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith %><br/></div><%@include file="foot.jspf"%><%
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith }
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith if (ireader != null)
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith ireader.close();
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith} else { // Entry page show the map
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith response.sendRedirect(context + "/index.jsp");
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith}
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith%>
daa301d2a0f17b5c1b04d777de3acf969b9b63d2Luke Smith