search.jsp revision 849
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R<%--
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.RCDDL HEADER START
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.RThe contents of this file are subject to the terms of the
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.RCommon Development and Distribution License (the "License").
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.RYou may not use this file except in compliance with the License.
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.RSee LICENSE.txt included in this distribution for the specific
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.Rlanguage governing permissions and limitations under the License.
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.RWhen distributing Covered Code, include this CDDL HEADER in each
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.Rfile and include the License file at LICENSE.txt.
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.RIf applicable, add the following below this CDDL HEADER, with the
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.Rfields enclosed by brackets "[]" replaced with your own identifying
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.Rinformation: Portions Copyright [yyyy] [name of copyright owner]
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.RCDDL HEADER END
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.RCopyright 2009 Sun Microsystems, Inc. All rights reserved.
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.RUse is subject to license terms.
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.Rident "%Z%%M% %I% %E% SMI"
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R--%><%@ page import = "javax.servlet.*,
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.Rjava.lang.Integer,
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.Rjavax.servlet.http.*,
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.Rjava.util.Hashtable,
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.Rjava.util.Vector,
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.Rjava.util.Date,
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.Rjava.util.ArrayList,
8a53449ad0353d5c18296b79b52a2a7b957f6421René Genzjava.util.List,
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.Rjava.lang.*,
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.Rjava.io.*,
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.Rjava.io.StringReader,
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.Rorg.opensolaris.opengrok.analysis.*,
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.Rorg.opensolaris.opengrok.index.IndexDatabase,
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.Rorg.opensolaris.opengrok.search.*,
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.Rorg.opensolaris.opengrok.web.*,
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.Rorg.opensolaris.opengrok.search.context.*,
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.Rorg.opensolaris.opengrok.configuration.*,
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.Rorg.apache.lucene.search.spell.LuceneDictionary,
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.Rorg.apache.lucene.search.spell.SpellChecker,
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.Rorg.apache.lucene.store.FSDirectory,
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.Rorg.apache.lucene.analysis.*,
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.Rorg.apache.lucene.document.*,
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.Rorg.apache.lucene.index.*,
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.Rorg.apache.lucene.search.*,
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.Rorg.apache.lucene.queryParser.*"
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R%><%@ page session="false" %><%@ page errorPage="error.jsp" %><%
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.RDate starttime = new Date();
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.RString q = request.getParameter("q");
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.RString defs = request.getParameter("defs");
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.RString refs = request.getParameter("refs");
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.RString hist = request.getParameter("hist");
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.RString path = request.getParameter("path");
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R%><%@ include file="projects.jspf" %><%
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.RString sort = null;
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.Rfinal String LASTMODTIME = "lastmodtime";
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.Rfinal String RELEVANCY = "relevancy";
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.Rfinal String BY_PATH = "fullpath";
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.RCookie[] cookies = request.getCookies();
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.Rif (cookies != null) {
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R for (Cookie cookie : cookies) {
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R if (cookie.getName().equals("OpenGrok/sorting")) {
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R sort = cookie.getValue();
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R if (!LASTMODTIME.equals(sort) && !RELEVANCY.equals(sort) && !BY_PATH.equals(sort)) {
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R sort = RELEVANCY;
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R }
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R break;
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R }
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R }
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R}
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.RString sortParam = request.getParameter("sort");
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.Rif (sortParam != null) {
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R if (LASTMODTIME.equals(sortParam)) {
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R sort = LASTMODTIME;
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R } else if (RELEVANCY.equals(sortParam)) {
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R sort = RELEVANCY;
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R } else if (BY_PATH.equals(sortParam)) {
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R sort = BY_PATH;
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R }
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R if (sort != null) {
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R Cookie cookie = new Cookie("OpenGrok/sorting", sort);
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R response.addCookie(cookie);
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R }
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R} else { sort = RELEVANCY; }
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R//List<org.apache.lucene.document.Document> docs=new ArrayList<org.apache.lucene.document.Document>();
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.RString errorMsg = null;
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.Rif( q!= null && q.equals("")) q = null;
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.Rif( defs != null && defs.equals("")) defs = null;
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.Rif( refs != null && refs.equals("")) refs = null;
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.Rif( hist != null && hist.equals("")) hist = null;
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.Rif( path != null && path.equals("")) path = null;
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.Rif (project != null && project.size()<1) project = null;
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.Rif (q != null || defs != null || refs != null || hist != null || path != null) {
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R Searcher searcher = null; //the searcher used to open/search the index
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R TopDocCollector collector=null; // the collector used
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R ScoreDoc[] hits = null; // list of documents which result from the query
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R IndexReader ireader = null; //the reader used to open/search the index
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R Query query = null, defQuery = null; //the Query created by the QueryParser
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R boolean allCollected=false;
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R int totalHits=0;
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R int start = 0; //the first index displayed on this page
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R //TODO deprecate max this and merge with paging and param n - TEST needed
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R //int max = 25; //the maximum items displayed on this page
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R int max=RuntimeEnvironment.getInstance().getHitsPerPage();
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R int hitsPerPage = RuntimeEnvironment.getInstance().getHitsPerPage();
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R int cachePages= RuntimeEnvironment.getInstance().getCachePages();
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R int thispage = 0; //used for the for/next either max or
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R String moreUrl = null;
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R CompatibleAnalyser analyzer = new CompatibleAnalyser();
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R String qstr = "";
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R String result = "";
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R try {
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R String DATA_ROOT = env.getDataRootPath();
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R if(DATA_ROOT.equals("")) {
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R throw new Exception("DATA_ROOT parameter is not configured in web.xml!");
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R }
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R File data_root = new File(DATA_ROOT);
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R if(!data_root.isDirectory()) {
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R throw new Exception("DATA_ROOT parameter in web.xml does not exist or is not a directory!");
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R }
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R //String date = request.getParameter("date");
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R try {
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R //TODO merge paging hitsPerPage with parameter n (has to reflect the search if changed so proper number is cached first time)
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R start = Integer.parseInt(request.getParameter("start")); //parse the max results first
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R max = Integer.parseInt(request.getParameter("n")); //then the start index
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R if(max < 0 || (max % 10 != 0) || max > 50) max = 25;
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R if(start < 0 ) start = 0;
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R } catch (Exception e) { }
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R qstr = Util.buildQueryString(q, defs, refs, path, hist);
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R QueryParser qparser = new QueryParser("full", analyzer);
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R qparser.setDefaultOperator(QueryParser.AND_OPERATOR);
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R qparser.setAllowLeadingWildcard(env.isAllowLeadingWildcard());
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R query = qparser.parse(qstr); //parse the
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R File root = new File(RuntimeEnvironment.getInstance().getDataRootFile(),
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R "index");
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R if (RuntimeEnvironment.getInstance().hasProjects()) {
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R if (project == null) {
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R errorMsg = "<b>Error:</b> You must select a project!";
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R } else {
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R if (project.size() > 1) { //more projects
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R IndexSearcher[] searchables = new IndexSearcher[project.size()];
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R File droot = new File(RuntimeEnvironment.getInstance().getDataRootFile(), "index");
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R int ii = 0;
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R //TODO might need to rewrite to Project instead of String , need changes in projects.jspf too
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R for (String proj : project) {
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R ireader = (IndexReader.open(new File(droot, proj)));
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R searchables[ii++] = new IndexSearcher(ireader);
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R }
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R if (Runtime.getRuntime().availableProcessors() > 1) {
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R searcher = new ParallelMultiSearcher(searchables);
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R } else {
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R searcher = new MultiSearcher(searchables);
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R }
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R } else { // just 1 project selected
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R root = new File(root, project.get(0));
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R ireader = IndexReader.open(root);
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R searcher = new IndexSearcher(ireader);
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R }
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R }
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R } else { //no project setup
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R ireader = IndexReader.open(root);
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R searcher = new IndexSearcher(ireader);
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R }
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R //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 ;)
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R if (errorMsg == null) {
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R collector = new TopDocCollector(hitsPerPage*cachePages);
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R if (LASTMODTIME.equals(sort)) {
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R Sort sortf = new Sort("date", true);
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R TopFieldDocs fdocs=searcher.search(query, null,hitsPerPage*cachePages, sortf);
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R totalHits=fdocs.totalHits;
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R if (start>=hitsPerPage*cachePages && !allCollected) { //fetch ALL results only if above cachePages
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R fdocs=searcher.search(query, null, totalHits, sortf);
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R allCollected=true;
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R }
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R hits = fdocs.scoreDocs;
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R } else if (BY_PATH.equals(sort)) {
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R Sort sortf = new Sort(BY_PATH);
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R TopFieldDocs fdocs=searcher.search(query, null,hitsPerPage*cachePages, sortf);
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R totalHits=fdocs.totalHits;
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R if (start>=hitsPerPage*cachePages && !allCollected) { //fetch ALL results only if above cachePages
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R fdocs=searcher.search(query, null,totalHits, sortf);
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R allCollected=true;
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R }
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R hits = fdocs.scoreDocs;
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R } else {
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R searcher.search(query,collector);
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R totalHits=collector.getTotalHits();
ee1e4c0fa7e8a973ecf16b7535664b8f47fc7e75Niranjan M.R if (start>=hitsPerPage*cachePages && !allCollected) { //fetch ALL results only if above cachePages
collector = new TopDocCollector(totalHits);
searcher.search(query,collector);
allCollected=true;
}
hits=collector.topDocs().scoreDocs;
}
//below will get all the documents
// for (int i = 0; i < hits.length; i++) {
// int docId = hits[i].doc;
// Document d = searcher.doc(docId);
// docs.add(d);
// }
}
thispage = max;
} catch (BooleanQuery.TooManyClauses e) {
errorMsg = "<b>Error:</b> Too many results for wildcard!";
} catch (ParseException e) {
errorMsg = "<b>Error parsing your query:</b><br/>" + Util.htmlize(qstr) +
"<p/>You might try to enclose your search term in quotes: <br/>" +
"<a href=search?q=\"" + Util.URIEncode(qstr) + "\">\"" + Util.htmlize(qstr) +
"\"</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/>" +
"Error message from parser:<br/>" + Util.htmlize(e.getMessage());
} catch (FileNotFoundException e) {
errorMsg = "<b>Error:</b> Index database not found";
} catch (Exception e) {
errorMsg = "<b>Error:</b> " + Util.htmlize(e.getMessage());
}
// @TODO fix me. I should try to figure out where the exact hit is instead
// of returning a page with just _one_ entry in....
if (hits != null && hits.length == 1 && request.getServletPath().equals("/s") && (query != null && query instanceof TermQuery)) {
String preFragmentPath = Util.URIEncodePath(context + "/xref" + searcher.doc(hits[0].doc).get("path"));
String fragment = Util.URIEncode(((TermQuery)query).getTerm().text());
StringBuilder url = new StringBuilder(preFragmentPath);
url.append("#");
url.append(fragment);
response.sendRedirect(url.toString());
} else {
String pageTitle = "Search";
RuntimeEnvironment environment = RuntimeEnvironment.getInstance();
environment.register();
%><%@ include file="httpheader.jspf" %>
<body>
<div id="page">
<div id="header"><%@ include file="pageheader.jspf" %></div>
<div id="Masthead"></div>
<div id="bar">
<table border="0" width="100%"><tr><td><a href="<%=context%>" id="home">Home</a></td><td align="right"><%
{
StringBuffer url = request.getRequestURL();
url.append('?');
String querys = request.getQueryString();
if (querys != null) {
int idx = querys.indexOf("sort=");
if (idx == -1) {
url.append(querys);
url.append('&');
} else {
url.append(querys.substring(0, idx));
}
}
%>Sort by: <%
url.append("sort=");
if (sort == null || RELEVANCY.equals(sort)) {
%><b>relevance</b> | <a href="<%=url.toString()+LASTMODTIME%>">last modified time</a> | <a href="<%=url.toString()+BY_PATH%>">path</a><%
} else if (LASTMODTIME.equals(sort)) {
%><a href="<%=url.toString()+RELEVANCY%>">relevance</a> | <b>last modified time</b> | <a href="<%=url.toString()+BY_PATH%>">path</a><%
} else if (BY_PATH.equals(sort)) {
%><a href="<%=url.toString()+RELEVANCY%>">relevance</a> | <a href="<%=url.toString()+LASTMODTIME%>">last modified time</a> | <b>path</b><%
} else {
%><a href="<%=url.toString()+RELEVANCY%>">relevance</a> | <a href="<%=url.toString()+LASTMODTIME%>">last modified time</a> | <a href="<%=url.toString()+BY_PATH%>">path</a><%
}
} %></td></tr></table>
</div>
<div id="menu">
<%@ include file="menu.jspf"%>
</div>
<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
if( hits == null || errorMsg != null) {
%><%=errorMsg%><%
} else if (hits.length == 0) {
File spellIndex = new File(env.getDataRootPath(), "spellIndex");
File[] spellIndexes=null;
if (RuntimeEnvironment.getInstance().hasProjects()) {
if (project.size() > 1) { //more projects
spellIndexes = new File[project.size()];
int ii = 0;
//TODO might need to rewrite to Project instead of String , need changes in projects.jspf too
for (String proj : project) {
spellIndexes[ii++] = new File(spellIndex,proj);
}
} else { // just 1 project selected
spellIndex = new File(spellIndex, project.get(0));
}
}
int count=1;
if (spellIndexes!=null) {count=spellIndexes.length;}
for (int idx = 0; idx < count; idx++) {
if (spellIndexes!=null) spellIndex = spellIndexes[idx];
if (spellIndex.exists()) {
FSDirectory spellDirectory = FSDirectory.getDirectory(spellIndex);
SpellChecker checker = new SpellChecker(spellDirectory);
Date sstart = new Date();
boolean printHeader = true;
String[] toks;
if(q != null) {
toks = q.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(), 5);
for(int i = 0;i < ret.length; i++) {
if (printHeader) {
%><p><font color="#cc0000">Did you mean(for <%=spellIndex.getName()%>)</font>:<%
printHeader = false;
}
%> <a href=search?q=<%=ret[i]%>><%=ret[i]%></a> &nbsp; <%
}
}
}
}
}
if(refs != null) {
toks = refs.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(), 5);
for(int i = 0;i < ret.length; i++) {
if (printHeader) {
%><p><font color="#cc0000">Did you mean(for <%=spellIndex.getName()%>)</font>:<%
printHeader = false;
}
%> <a href=search?refs=<%=ret[i]%>><%=ret[i]%></a> &nbsp; <%
}
}
}
}
}
//TODO it seems the only true spellchecker is for below field, see IndexDatabase createspellingsuggestions ...
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(), 5);
for(int i = 0;i < ret.length; i++) {
if (printHeader) {
%><p><font color="#cc0000">Did you mean(for <%=spellIndex.getName()%>)</font>:<%
printHeader = false;
}
%> <a href=search?defs=<%=ret[i]%>><%=ret[i]%></a> &nbsp; <%
}
}
}
}
}
if (printHeader) {
%></p><%
}
spellDirectory.close();
}
}
%><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 < totalHits) {
if((start + max) < totalHits) {
thispage = max;
} else {
thispage = totalHits - 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));
for (Iterator it = project.iterator(); it.hasNext();) {
url=url+(project == null ? "" : "&amp;project=" + Util.URIEncode((String)it.next()));
}
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<totalHits && 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 < totalHits) {
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 = totalHits - 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><%=totalHits%></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) {
}
//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,
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");
}
%>