search.jsp revision 850
78cd73fcf63ea9fd6539e0abe051e64705dfb532Kay Sievers<%--
78cd73fcf63ea9fd6539e0abe051e64705dfb532Kay SieversCDDL HEADER START
78cd73fcf63ea9fd6539e0abe051e64705dfb532Kay Sievers
78cd73fcf63ea9fd6539e0abe051e64705dfb532Kay SieversThe contents of this file are subject to the terms of the
78cd73fcf63ea9fd6539e0abe051e64705dfb532Kay SieversCommon Development and Distribution License (the "License").
762f91fa600b3b2887e3b088cd700216a85e3c81Kay SieversYou may not use this file except in compliance with the License.
78cd73fcf63ea9fd6539e0abe051e64705dfb532Kay Sievers
71092d70af35567dd154d3de2ce04ce62e157a7cLennart PoetteringSee LICENSE.txt included in this distribution for the specific
ebcd5d3acd4c470668bbcd945a5aa42f0af5ccf0Kay Sieverslanguage governing permissions and limitations under the License.
ebcd5d3acd4c470668bbcd945a5aa42f0af5ccf0Kay Sievers
80037e4d17d0c8f28d0ff610902babc9e2b4e2f9Kay SieversWhen distributing Covered Code, include this CDDL HEADER in each
ebcd5d3acd4c470668bbcd945a5aa42f0af5ccf0Kay Sieversfile and include the License file at LICENSE.txt.
7c66aeba0f28cb82027d6015405ed71afa3b6059Kay SieversIf applicable, add the following below this CDDL HEADER, with the
7c66aeba0f28cb82027d6015405ed71afa3b6059Kay Sieversfields enclosed by brackets "[]" replaced with your own identifying
c904f64d84db8c4eebedf210ba10893f19ba05edLennart Poetteringinformation: Portions Copyright [yyyy] [name of copyright owner]
c904f64d84db8c4eebedf210ba10893f19ba05edLennart Poettering
05677bb78079c3fa0283101aac2c07581f4873f1Lennart PoetteringCDDL HEADER END
73090dc815390f4fca4e3ed8a7e1d3806605daaaLennart Poettering
71092d70af35567dd154d3de2ce04ce62e157a7cLennart PoetteringCopyright 2009 Sun Microsystems, Inc. All rights reserved.
ddd88763921a1534081ed28e36f6712a85449005Lennart PoetteringUse is subject to license terms.
f957632b960a0a42999b38ded7089fa602b41745Kay Sievers
f957632b960a0a42999b38ded7089fa602b41745Kay Sieversident "%Z%%M% %I% %E% SMI"
f957632b960a0a42999b38ded7089fa602b41745Kay Sievers
f957632b960a0a42999b38ded7089fa602b41745Kay Sievers--%><%@ page import = "javax.servlet.*,
9a36607584bbd1d78775353e022a51794b4e27b1Lennart Poetteringjava.lang.Integer,
9a36607584bbd1d78775353e022a51794b4e27b1Lennart Poetteringjavax.servlet.http.*,
a40593a0d0d740efa387e35411e1e456a6c5aba7Lennart Poetteringjava.util.Hashtable,
20ffc4c4a9226b0e45cc02ad9c0108981626c0bbKay Sieversjava.util.Vector,
71092d70af35567dd154d3de2ce04ce62e157a7cLennart Poetteringjava.util.Date,
069cfc85f876bb6966cb5a9bbe0235f5064622cdLennart Poetteringjava.util.ArrayList,
069cfc85f876bb6966cb5a9bbe0235f5064622cdLennart Poetteringjava.util.List,
069cfc85f876bb6966cb5a9bbe0235f5064622cdLennart Poetteringjava.lang.*,
939b8f14dcd9312140d001b55b4e7a87173682efLennart Poetteringjava.io.*,
939b8f14dcd9312140d001b55b4e7a87173682efLennart Poetteringjava.io.StringReader,
509407003de0c77259e5e46b567d2a464acbb6f4Shawn Landdenorg.opensolaris.opengrok.analysis.*,
6b17d77e3e9eb80786f685e161515a07e0d8c4b8Lennart Poetteringorg.opensolaris.opengrok.index.IndexDatabase,
ec8927ca5940e809f0b72f530582c76f1db4f065Lennart Poetteringorg.opensolaris.opengrok.search.*,
ec8927ca5940e809f0b72f530582c76f1db4f065Lennart Poetteringorg.opensolaris.opengrok.web.*,
ec8927ca5940e809f0b72f530582c76f1db4f065Lennart Poetteringorg.opensolaris.opengrok.search.context.*,
1afd5be42f8f4105dd47c71ce968c9d5bf81e0a8Lennart Poetteringorg.opensolaris.opengrok.configuration.*,
7b63bde1ed0d4f30c799c9b4737fa926465929f9Lennart Poetteringorg.apache.lucene.search.spell.LuceneDictionary,
7b63bde1ed0d4f30c799c9b4737fa926465929f9Lennart Poetteringorg.apache.lucene.search.spell.SpellChecker,
06e2968ea6e3d8f90eb715b4a8e8a43b3d7449abLennart Poetteringorg.apache.lucene.store.FSDirectory,
06e2968ea6e3d8f90eb715b4a8e8a43b3d7449abLennart Poetteringorg.apache.lucene.analysis.*,
939b8f14dcd9312140d001b55b4e7a87173682efLennart Poetteringorg.apache.lucene.document.*,
06e2968ea6e3d8f90eb715b4a8e8a43b3d7449abLennart Poetteringorg.apache.lucene.index.*,
5b40d33761376354116a8cddb9b9fbdb6c4727d6Lennart Poetteringorg.apache.lucene.search.*,
5b40d33761376354116a8cddb9b9fbdb6c4727d6Lennart Poetteringorg.apache.lucene.queryParser.*"
f7f21d33db5dfe88dc8175c61dada44013347729Lennart Poettering%><%@ page session="false" %><%@ page errorPage="error.jsp" %><%
f7f21d33db5dfe88dc8175c61dada44013347729Lennart PoetteringDate starttime = new Date();
1ab27db89064b7f9f2f6d50566642fce803a2617Lennart PoetteringString q = request.getParameter("q");
1ab27db89064b7f9f2f6d50566642fce803a2617Lennart PoetteringString defs = request.getParameter("defs");
27b5482cc08b7fac1b6b15d980d42ae04f3ae1caLennart PoetteringString refs = request.getParameter("refs");
27b5482cc08b7fac1b6b15d980d42ae04f3ae1caLennart PoetteringString hist = request.getParameter("hist");
27b5482cc08b7fac1b6b15d980d42ae04f3ae1caLennart PoetteringString path = request.getParameter("path");
27b5482cc08b7fac1b6b15d980d42ae04f3ae1caLennart Poettering
b86fa936ce36976cd6a96034cf14ea267695bcb2Lennart Poettering%><%@ include file="projects.jspf" %><%
b86fa936ce36976cd6a96034cf14ea267695bcb2Lennart PoetteringString sort = null;
b86fa936ce36976cd6a96034cf14ea267695bcb2Lennart Poettering
b86fa936ce36976cd6a96034cf14ea267695bcb2Lennart Poetteringfinal String LASTMODTIME = "lastmodtime";
b86fa936ce36976cd6a96034cf14ea267695bcb2Lennart Poetteringfinal String RELEVANCY = "relevancy";
b86fa936ce36976cd6a96034cf14ea267695bcb2Lennart Poetteringfinal String BY_PATH = "fullpath";
b86fa936ce36976cd6a96034cf14ea267695bcb2Lennart Poettering
b86fa936ce36976cd6a96034cf14ea267695bcb2Lennart PoetteringCookie[] cookies = request.getCookies();
b86fa936ce36976cd6a96034cf14ea267695bcb2Lennart Poetteringif (cookies != null) {
b86fa936ce36976cd6a96034cf14ea267695bcb2Lennart Poettering for (Cookie cookie : cookies) {
a26336da875a6657d404d1e44b86ae067c34b110Kay Sievers if (cookie.getName().equals("OpenGrok/sorting")) {
a26336da875a6657d404d1e44b86ae067c34b110Kay Sievers sort = cookie.getValue();
e85647f73e235c2a6ea412cb8d841e092c373501Lennart Poettering if (!LASTMODTIME.equals(sort) && !RELEVANCY.equals(sort) && !BY_PATH.equals(sort)) {
eecd1362f7f4de432483b5d77c56726c3621a83aLennart Poettering sort = RELEVANCY;
eecd1362f7f4de432483b5d77c56726c3621a83aLennart Poettering }
14038c2e83001abfbcdc3f9f2402189a9b3d2f0cLennart Poettering break;
14038c2e83001abfbcdc3f9f2402189a9b3d2f0cLennart Poettering }
465349c06d994dd2cc6b6fc4109ac0b9952d500aLennart Poettering }
465349c06d994dd2cc6b6fc4109ac0b9952d500aLennart Poettering}
465349c06d994dd2cc6b6fc4109ac0b9952d500aLennart Poettering
465349c06d994dd2cc6b6fc4109ac0b9952d500aLennart PoetteringString sortParam = request.getParameter("sort");
465349c06d994dd2cc6b6fc4109ac0b9952d500aLennart Poetteringif (sortParam != null) {
465349c06d994dd2cc6b6fc4109ac0b9952d500aLennart Poettering if (LASTMODTIME.equals(sortParam)) {
eecd1362f7f4de432483b5d77c56726c3621a83aLennart Poettering sort = LASTMODTIME;
d889a2069a87e4617b32ddbdeace5a53a12c699dLennart Poettering } else if (RELEVANCY.equals(sortParam)) {
eecd1362f7f4de432483b5d77c56726c3621a83aLennart Poettering sort = RELEVANCY;
eecd1362f7f4de432483b5d77c56726c3621a83aLennart Poettering } else if (BY_PATH.equals(sortParam)) {
eecd1362f7f4de432483b5d77c56726c3621a83aLennart Poettering sort = BY_PATH;
eecd1362f7f4de432483b5d77c56726c3621a83aLennart Poettering }
06dab8e18aebf822392c7ca66c5bf3c1200fdec8Lennart Poettering if (sort != null) {
06dab8e18aebf822392c7ca66c5bf3c1200fdec8Lennart Poettering Cookie cookie = new Cookie("OpenGrok/sorting", sort);
7e2668c6fd5720ae4d2d55eb8a062739687516afLennart Poettering response.addCookie(cookie);
7e2668c6fd5720ae4d2d55eb8a062739687516afLennart Poettering }
7e2668c6fd5720ae4d2d55eb8a062739687516afLennart Poettering} else { sort = RELEVANCY; }
7e2668c6fd5720ae4d2d55eb8a062739687516afLennart Poettering
e85647f73e235c2a6ea412cb8d841e092c373501Lennart Poettering//List<org.apache.lucene.document.Document> docs=new ArrayList<org.apache.lucene.document.Document>();
e85647f73e235c2a6ea412cb8d841e092c373501Lennart PoetteringString errorMsg = null;
e01a15b71e18bf2008aec7e75041ffa42eb80b80Kay Sievers
a888b352eb53b07daa24fa859ceeb254336b293dLennart Poetteringif( q!= null && q.equals("")) q = null;
3b2d5b02ae231f1d3eb0d96eb980155d7797304eLennart Poetteringif( defs != null && defs.equals("")) defs = null;
3b2d5b02ae231f1d3eb0d96eb980155d7797304eLennart Poetteringif( refs != null && refs.equals("")) refs = null;
0f0dbc46ccf5aaaf3131446d0a4d78bc97a37295Lennart Poetteringif( hist != null && hist.equals("")) hist = null;
0f0dbc46ccf5aaaf3131446d0a4d78bc97a37295Lennart Poetteringif( path != null && path.equals("")) path = null;
3d9a412243035beeaaf3465a62065444a5adf21cLennart Poetteringif (project != null && project.size()<1) project = null;
3d9a412243035beeaaf3465a62065444a5adf21cLennart Poettering
88f642c00b1708c5e0203c1753a9ef91d1de5442Kay Sieversif (q != null || defs != null || refs != null || hist != null || path != null) {
88f642c00b1708c5e0203c1753a9ef91d1de5442Kay Sievers Searcher searcher = null; //the searcher used to open/search the index
20ffc4c4a9226b0e45cc02ad9c0108981626c0bbKay Sievers TopDocCollector collector=null; // the collector used
f25626edf4c39bb9409cb165e6ce9551dd130661Lennart Poettering ScoreDoc[] hits = null; // list of documents which result from the query
a0a3844815b0f346dba03f41245c620f432e462fLennart Poettering IndexReader ireader = null; //the reader used to open/search the index
a0a3844815b0f346dba03f41245c620f432e462fLennart Poettering Query query = null, defQuery = null; //the Query created by the QueryParser
9efaf380a7c7fa16f44b1aa15b967e99f331203aLennart Poettering boolean allCollected=false;
9efaf380a7c7fa16f44b1aa15b967e99f331203aLennart Poettering int totalHits=0;
1c334d993a8bb32241284479012a27a7509aaa3cLennart Poettering
9efaf380a7c7fa16f44b1aa15b967e99f331203aLennart Poettering int start = 0; //the first index displayed on this page
4ee717820208a4c8e92383d0dbefa401827fab38Kay Sievers //TODO deprecate max this and merge with paging and param n - TEST needed
4ee717820208a4c8e92383d0dbefa401827fab38Kay Sievers //int max = 25; //the maximum items displayed on this page
5ba2dc259f3cdd8fddef68cfd28380a32534e49aKay Sievers int max=RuntimeEnvironment.getInstance().getHitsPerPage();
5ba2dc259f3cdd8fddef68cfd28380a32534e49aKay Sievers
5ba2dc259f3cdd8fddef68cfd28380a32534e49aKay Sievers int hitsPerPage = RuntimeEnvironment.getInstance().getHitsPerPage();
5ba2dc259f3cdd8fddef68cfd28380a32534e49aKay Sievers int cachePages= RuntimeEnvironment.getInstance().getCachePages();
20ffc4c4a9226b0e45cc02ad9c0108981626c0bbKay Sievers
762f91fa600b3b2887e3b088cd700216a85e3c81Kay Sievers int thispage = 0; //used for the for/next either max or
762f91fa600b3b2887e3b088cd700216a85e3c81Kay Sievers String moreUrl = null;
762f91fa600b3b2887e3b088cd700216a85e3c81Kay Sievers CompatibleAnalyser analyzer = new CompatibleAnalyser();
762f91fa600b3b2887e3b088cd700216a85e3c81Kay Sievers String qstr = "";
b45f770f0049fbdf3f6c9db0ab11deeff4ccd86dKay Sievers String result = "";
b8217b7bd5fd171916a095b150fad4c3a37f5a41Kay Sievers try {
b45f770f0049fbdf3f6c9db0ab11deeff4ccd86dKay Sievers String DATA_ROOT = env.getDataRootPath();
b45f770f0049fbdf3f6c9db0ab11deeff4ccd86dKay Sievers if(DATA_ROOT.equals("")) {
b45f770f0049fbdf3f6c9db0ab11deeff4ccd86dKay Sievers throw new Exception("DATA_ROOT parameter is not configured in web.xml!");
b8217b7bd5fd171916a095b150fad4c3a37f5a41Kay Sievers }
08f23fd29c9df9c8b4e874933eb39711f069754bLennart Poettering File data_root = new File(DATA_ROOT);
08f23fd29c9df9c8b4e874933eb39711f069754bLennart Poettering if(!data_root.isDirectory()) {
18b754d345ecb0b15e369978aaffa72e9814b86aKay Sievers throw new Exception("DATA_ROOT parameter in web.xml does not exist or is not a directory!");
068665b6fd9839f27bcace7e8f56c0baa6935272Lennart Poettering }
b070e7f3c9ed680c821bd89d42506695f2438506Lennart Poettering //String date = request.getParameter("date");
b070e7f3c9ed680c821bd89d42506695f2438506Lennart Poettering try {
231931ffba1bca9d8759bbd6f797e56f8c6971faLennart Poettering //TODO merge paging hitsPerPage with parameter n (has to reflect the search if changed so proper number is cached first time)
231931ffba1bca9d8759bbd6f797e56f8c6971faLennart Poettering start = Integer.parseInt(request.getParameter("start")); //parse the max results first
169c4f65131fbc7bcb51e7d5487a715cdcd0e0ebLennart Poettering max = Integer.parseInt(request.getParameter("n")); //then the start index
169c4f65131fbc7bcb51e7d5487a715cdcd0e0ebLennart Poettering if(max < 0 || (max % 10 != 0) || max > 50) max = 25;
6ba383fa49e01302dfeae1f5083bb942b055628bLennart Poettering if(start < 0 ) start = 0;
6ba383fa49e01302dfeae1f5083bb942b055628bLennart Poettering } catch (Exception e) { }
bd08f2422491169e92dc0899d5ba848fcae4c15cLennart Poettering
bd08f2422491169e92dc0899d5ba848fcae4c15cLennart Poettering qstr = Util.buildQueryString(q, defs, refs, path, hist);
71100051c5d351daac20610f3a4b8c14901088d8Lennart Poettering
d3c7d7dd77b2b72315164b672462825cef6c0f9aKay Sievers QueryParser qparser = new QueryParser("full", analyzer);
71100051c5d351daac20610f3a4b8c14901088d8Lennart Poettering qparser.setDefaultOperator(QueryParser.AND_OPERATOR);
fb0864e7b9c6d26269ccea6ec5c0fd921c029781Lennart Poettering qparser.setAllowLeadingWildcard(env.isAllowLeadingWildcard());
fb0864e7b9c6d26269ccea6ec5c0fd921c029781Lennart Poettering
18da49531e4c6b31bd2439b4d738dc1bb9660af1Lennart Poettering query = qparser.parse(qstr); //parse the
18da49531e4c6b31bd2439b4d738dc1bb9660af1Lennart Poettering
9586cdfab6a2638078702b7fea7e16b3a71899e2Lennart Poettering File root = new File(RuntimeEnvironment.getInstance().getDataRootFile(),
9586cdfab6a2638078702b7fea7e16b3a71899e2Lennart Poettering "index");
9586cdfab6a2638078702b7fea7e16b3a71899e2Lennart Poettering
9586cdfab6a2638078702b7fea7e16b3a71899e2Lennart Poettering if (RuntimeEnvironment.getInstance().hasProjects()) {
6b80b9b8ee6d372e00ece51e6a11c6d31899aaecLennart Poettering if (project == null) {
6b80b9b8ee6d372e00ece51e6a11c6d31899aaecLennart Poettering errorMsg = "<b>Error:</b> You must select a project!";
7f110ff9b8828b477e87de7b28c708cf69a3d008Lennart Poettering } else {
7f110ff9b8828b477e87de7b28c708cf69a3d008Lennart Poettering if (project.size() > 1) { //more projects
7f110ff9b8828b477e87de7b28c708cf69a3d008Lennart Poettering IndexSearcher[] searchables = new IndexSearcher[project.size()];
7f110ff9b8828b477e87de7b28c708cf69a3d008Lennart Poettering File droot = new File(RuntimeEnvironment.getInstance().getDataRootFile(), "index");
101f077676e9fbe1a66c8b2dc4864a8d7a94c372Lennart Poettering int ii = 0;
101f077676e9fbe1a66c8b2dc4864a8d7a94c372Lennart Poettering //TODO might need to rewrite to Project instead of String , need changes in projects.jspf too
f7f964eb3625e4cca7f16377fa12aa7a760243e7Lennart Poettering for (String proj : project) {
f7f964eb3625e4cca7f16377fa12aa7a760243e7Lennart Poettering ireader = (IndexReader.open(new File(droot, proj)));
144f0fc0c8a5e2f6b72179e2b5fb992474da24adLennart Poettering searchables[ii++] = new IndexSearcher(ireader);
d0e5a33374cee92962af33dfc03873e470b014f6Lennart Poettering }
d0e5a33374cee92962af33dfc03873e470b014f6Lennart Poettering if (Runtime.getRuntime().availableProcessors() > 1) {
d0e5a33374cee92962af33dfc03873e470b014f6Lennart Poettering searcher = new ParallelMultiSearcher(searchables);
d0e5a33374cee92962af33dfc03873e470b014f6Lennart Poettering } else {
d0e5a33374cee92962af33dfc03873e470b014f6Lennart Poettering searcher = new MultiSearcher(searchables);
15e9fbd851c15ecaad4888932584f37dcd26111aLennart Poettering }
15e9fbd851c15ecaad4888932584f37dcd26111aLennart Poettering } else { // just 1 project selected
53ed2eeb2e709a6c0d152d7bdf2d9a4b9f997a16Lennart Poettering root = new File(root, project.get(0));
53ed2eeb2e709a6c0d152d7bdf2d9a4b9f997a16Lennart Poettering ireader = IndexReader.open(root);
353e12c2f4a9e96a47eb80b80d2ffb7bc1d44a1bLennart Poettering searcher = new IndexSearcher(ireader);
353e12c2f4a9e96a47eb80b80d2ffb7bc1d44a1bLennart Poettering }
680a1dbc354b2f437b4e06e27d4c43217977efdfLennart Poettering }
680a1dbc354b2f437b4e06e27d4c43217977efdfLennart Poettering } else { //no project setup
7e64c73a93cdcc7068280f3e3ba8adbd6c6f8f84Lennart Poettering ireader = IndexReader.open(root);
7e64c73a93cdcc7068280f3e3ba8adbd6c6f8f84Lennart Poettering searcher = new IndexSearcher(ireader);
c4aa65e7147dc742886edf25593e10466b02fc3aLennart Poettering }
7e64c73a93cdcc7068280f3e3ba8adbd6c6f8f84Lennart Poettering
36e43bddd0a4526e77cdae2c922bb29f67bd74adLennart Poettering //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 ;)
36e43bddd0a4526e77cdae2c922bb29f67bd74adLennart Poettering if (errorMsg == null) {
b61c90514e134dc781617d172961f25e7352f53bLennart Poettering collector = new TopDocCollector(hitsPerPage*cachePages);
b61c90514e134dc781617d172961f25e7352f53bLennart Poettering if (LASTMODTIME.equals(sort)) {
a558d00381291afd6a81f7df07269fe76eeae556Lennart Poettering Sort sortf = new Sort("date", true);
a558d00381291afd6a81f7df07269fe76eeae556Lennart Poettering TopFieldDocs fdocs=searcher.search(query, null,hitsPerPage*cachePages, sortf);
a558d00381291afd6a81f7df07269fe76eeae556Lennart Poettering totalHits=fdocs.totalHits;
a558d00381291afd6a81f7df07269fe76eeae556Lennart Poettering if (start>=hitsPerPage*cachePages && !allCollected) { //fetch ALL results only if above cachePages
a558d00381291afd6a81f7df07269fe76eeae556Lennart Poettering fdocs=searcher.search(query, null, totalHits, sortf);
a558d00381291afd6a81f7df07269fe76eeae556Lennart Poettering allCollected=true;
a558d00381291afd6a81f7df07269fe76eeae556Lennart Poettering }
a558d00381291afd6a81f7df07269fe76eeae556Lennart Poettering hits = fdocs.scoreDocs;
a558d00381291afd6a81f7df07269fe76eeae556Lennart Poettering } else if (BY_PATH.equals(sort)) {
a558d00381291afd6a81f7df07269fe76eeae556Lennart Poettering Sort sortf = new Sort(BY_PATH);
a558d00381291afd6a81f7df07269fe76eeae556Lennart Poettering TopFieldDocs fdocs=searcher.search(query, null,hitsPerPage*cachePages, sortf);
a558d00381291afd6a81f7df07269fe76eeae556Lennart Poettering totalHits=fdocs.totalHits;
a558d00381291afd6a81f7df07269fe76eeae556Lennart Poettering if (start>=hitsPerPage*cachePages && !allCollected) { //fetch ALL results only if above cachePages
a558d00381291afd6a81f7df07269fe76eeae556Lennart Poettering fdocs=searcher.search(query, null,totalHits, sortf);
05aa9edde0f9f4077b8120389c93cb0134eda9c5Lennart Poettering allCollected=true;
05aa9edde0f9f4077b8120389c93cb0134eda9c5Lennart Poettering }
31ed59c51126fce7d958c188772a397e2a1ed010Lennart Poettering hits = fdocs.scoreDocs;
31ed59c51126fce7d958c188772a397e2a1ed010Lennart Poettering } else {
62f21ec91ad8e7e24079962f4df066b0094fe68dLennart Poettering searcher.search(query,collector);
62f21ec91ad8e7e24079962f4df066b0094fe68dLennart Poettering totalHits=collector.getTotalHits();
62f21ec91ad8e7e24079962f4df066b0094fe68dLennart Poettering if (start>=hitsPerPage*cachePages && !allCollected) { //fetch ALL results only if above cachePages
62f21ec91ad8e7e24079962f4df066b0094fe68dLennart Poettering collector = new TopDocCollector(totalHits);
62f21ec91ad8e7e24079962f4df066b0094fe68dLennart Poettering searcher.search(query,collector);
62f21ec91ad8e7e24079962f4df066b0094fe68dLennart Poettering allCollected=true;
62f21ec91ad8e7e24079962f4df066b0094fe68dLennart Poettering }
62f21ec91ad8e7e24079962f4df066b0094fe68dLennart Poettering hits=collector.topDocs().scoreDocs;
87a8baa35d6d65ac3b58ae8e26e338e67f8ae8edLennart Poettering }
87a8baa35d6d65ac3b58ae8e26e338e67f8ae8edLennart Poettering
87a8baa35d6d65ac3b58ae8e26e338e67f8ae8edLennart Poettering //below will get all the documents
87a8baa35d6d65ac3b58ae8e26e338e67f8ae8edLennart Poettering// for (int i = 0; i < hits.length; i++) {
0716c60e37d2083325cd5316caf4310f0acc9a89Lennart Poettering// int docId = hits[i].doc;
87a8baa35d6d65ac3b58ae8e26e338e67f8ae8edLennart Poettering// Document d = searcher.doc(docId);
5ba081b0fb02380cee4c2ff5bc7e05f869eb8415Lennart Poettering// docs.add(d);
5ba081b0fb02380cee4c2ff5bc7e05f869eb8415Lennart Poettering// }
b3fa47e0819b08ea32e69e19e6d88ce2daca069dLennart Poettering
b3fa47e0819b08ea32e69e19e6d88ce2daca069dLennart Poettering }
7f3e62571a63ac90de6ac5eefeeb8d3e9aa6f49eLennart Poettering thispage = max;
7f3e62571a63ac90de6ac5eefeeb8d3e9aa6f49eLennart Poettering } catch (BooleanQuery.TooManyClauses e) {
7f3e62571a63ac90de6ac5eefeeb8d3e9aa6f49eLennart Poettering errorMsg = "<b>Error:</b> Too many results for wildcard!";
7f3e62571a63ac90de6ac5eefeeb8d3e9aa6f49eLennart Poettering } catch (ParseException e) {
4cbd9ecf45f64c3a9acc99d473fbf3be3687ae24Lennart Poettering errorMsg = "<b>Error parsing your query:</b><br/>" + Util.htmlize(qstr) +
4cbd9ecf45f64c3a9acc99d473fbf3be3687ae24Lennart Poettering "<p/>You might try to enclose your search term in quotes: <br/>" +
a6eb9147a820d1c08b315867373a21bd0ece2f05Lennart Poettering "<a href=search?q=\"" + Util.URIEncode(qstr) + "\">\"" + Util.htmlize(qstr) +
a6eb9147a820d1c08b315867373a21bd0ece2f05Lennart Poettering "\"</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/>" +
b011116d1829bde044a638cbabfb070a7e0e8fa7Kay Sievers "Error message from parser:<br/>" + Util.htmlize(e.getMessage());
b011116d1829bde044a638cbabfb070a7e0e8fa7Kay Sievers } catch (FileNotFoundException e) {
7d441ddb5ca090b5a97f58ac4b4d97b3e84fa81eLennart Poettering errorMsg = "<b>Error:</b> Index database not found";
65c0cf7108ae3537a357c74b4586a783baba82f9Lennart Poettering } catch (Exception e) {
65c0cf7108ae3537a357c74b4586a783baba82f9Lennart Poettering errorMsg = "<b>Error:</b> " + Util.htmlize(e.getMessage());
7ef5875d142f01ab4fe8d35412d48c10723ae2d4Lennart Poettering }
7ef5875d142f01ab4fe8d35412d48c10723ae2d4Lennart Poettering
f957632b960a0a42999b38ded7089fa602b41745Kay Sievers // @TODO fix me. I should try to figure out where the exact hit is instead
f957632b960a0a42999b38ded7089fa602b41745Kay Sievers // of returning a page with just _one_ entry in....
f957632b960a0a42999b38ded7089fa602b41745Kay Sievers if (hits != null && hits.length == 1 && request.getServletPath().equals("/s") && (query != null && query instanceof TermQuery)) {
a2f5666d06fe8233025738047115bb9e3959df3eLennart Poettering String preFragmentPath = Util.URIEncodePath(context + "/xref" + searcher.doc(hits[0].doc).get("path"));
a2f5666d06fe8233025738047115bb9e3959df3eLennart Poettering String fragment = Util.URIEncode(((TermQuery)query).getTerm().text());
ad740100d108282d0244d5739d4dcc86fe4c5fdeLennart Poettering
ad740100d108282d0244d5739d4dcc86fe4c5fdeLennart Poettering StringBuilder url = new StringBuilder(preFragmentPath);
c821bd28c2ecce8d35248d61949fe1c0c3030b6cLennart Poettering url.append("#");
c821bd28c2ecce8d35248d61949fe1c0c3030b6cLennart Poettering url.append(fragment);
de6c78f8795743894431a099d26ec562a8acf3dfLennart Poettering
7d441ddb5ca090b5a97f58ac4b4d97b3e84fa81eLennart Poettering response.sendRedirect(url.toString());
14e639ae7a1dbf156273ce697d30fbc6c6594209Lennart Poettering } else {
14e639ae7a1dbf156273ce697d30fbc6c6594209Lennart Poettering String pageTitle = "Search";
ff01d048b4c1455241c894cf7982662c9d28fd34Lennart Poettering RuntimeEnvironment environment = RuntimeEnvironment.getInstance();
ff01d048b4c1455241c894cf7982662c9d28fd34Lennart Poettering environment.register();
d3c7d7dd77b2b72315164b672462825cef6c0f9aKay Sievers %><%@ include file="httpheader.jspf" %>
72b9ed828bd22f3ddd74b6853c183eebf006d6d8Lennart Poettering<body>
1d6702e8d3877c0bebf3ac817dc45ff72f5ecfa9Lennart Poettering<div id="page">
1d6702e8d3877c0bebf3ac817dc45ff72f5ecfa9Lennart Poettering <div id="header"><%@ include file="pageheader.jspf" %></div>
1d6702e8d3877c0bebf3ac817dc45ff72f5ecfa9Lennart Poettering<div id="Masthead"></div>
71092d70af35567dd154d3de2ce04ce62e157a7cLennart Poettering<div id="bar">
71092d70af35567dd154d3de2ce04ce62e157a7cLennart Poettering <table border="0" width="100%"><tr><td><a href="<%=context%>" id="home">Home</a></td><td align="right"><%
71092d70af35567dd154d3de2ce04ce62e157a7cLennart Poettering {
0a55b298d930543c8065bb9e708dd112562b1736Lennart Poettering String url = "s?";
97f73ffb04947acf0a5854e3a7bdbb7a0105f6faLennart Poettering url = url + (q == null ? "" : "&amp;q=" + Util.URIEncode(q)) +
97f73ffb04947acf0a5854e3a7bdbb7a0105f6faLennart Poettering (defs == null ? "" : "&amp;defs=" + Util.URIEncode(defs)) +
85f248b26653f5322c26735661d63d4e8460c30eLennart Poettering (refs == null ? "" : "&amp;refs=" + Util.URIEncode(refs)) +
85f248b26653f5322c26735661d63d4e8460c30eLennart Poettering (path == null ? "" : "&amp;path=" + Util.URIEncode(path)) +
1258097cd3cdbc5dd3d264850119e553a29c5068Lennart Poettering (hist == null ? "" : "&amp;hist=" + Util.URIEncode(hist));
1258097cd3cdbc5dd3d264850119e553a29c5068Lennart Poettering if (hasProjects) {
1258097cd3cdbc5dd3d264850119e553a29c5068Lennart Poettering url = url + "&amp;project=";
a4c279f87451186b8beb1b8cc21c7cad561ecf4bLennart Poettering for (Iterator it = project.iterator(); it.hasNext();) {
a4c279f87451186b8beb1b8cc21c7cad561ecf4bLennart Poettering url = url + (project == null ? "" : Util.URIEncode((String) it.next()) + ",");
d3fc81bd6a5a046b22600ac1204df220c93d2c15Lennart Poettering }
d3fc81bd6a5a046b22600ac1204df220c93d2c15Lennart Poettering }
d3fc81bd6a5a046b22600ac1204df220c93d2c15Lennart Poettering
d3fc81bd6a5a046b22600ac1204df220c93d2c15Lennart Poettering %>Sort by: <%
7c697168102cb64c5cb65a542959684014da99c7Lennart Poettering url=url+("&amp;sort=");
253ee27a0c7a410d27d490bb79ea97caed6a2b68Lennart Poettering
71092d70af35567dd154d3de2ce04ce62e157a7cLennart Poettering if (sort == null || RELEVANCY.equals(sort)) {
8d0e38a2b966799af884e78a54fd6a2dffa44788Lennart Poettering %><b>relevance</b> | <a href="<%=url+LASTMODTIME%>">last modified time</a> | <a href="<%=url+BY_PATH%>">path</a><%
f28f1daf754a9a07de90e6fc4ada581bf5de677dLennart Poettering } else if (LASTMODTIME.equals(sort)) {
f28f1daf754a9a07de90e6fc4ada581bf5de677dLennart Poettering %><a href="<%=url+RELEVANCY%>">relevance</a> | <b>last modified time</b> | <a href="<%=url+BY_PATH%>">path</a><%
f28f1daf754a9a07de90e6fc4ada581bf5de677dLennart Poettering } else if (BY_PATH.equals(sort)) {
f28f1daf754a9a07de90e6fc4ada581bf5de677dLennart Poettering %><a href="<%=url+RELEVANCY%>">relevance</a> | <a href="<%=url+LASTMODTIME%>">last modified time</a> | <b>path</b><%
88a07670cfa974a605c7c7b520b8a3135fce37f9Lennart Poettering } else {
88a07670cfa974a605c7c7b520b8a3135fce37f9Lennart Poettering %><a href="<%=url+RELEVANCY%>">relevance</a> | <a href="<%=url+LASTMODTIME%>">last modified time</a> | <a href="<%=url+BY_PATH%>">path</a><%
88a07670cfa974a605c7c7b520b8a3135fce37f9Lennart Poettering }
916abb21d0a6653e0187b91591e492026886b0a4Lennart Poettering } %></td></tr></table>
916abb21d0a6653e0187b91591e492026886b0a4Lennart Poettering</div>
71092d70af35567dd154d3de2ce04ce62e157a7cLennart Poettering<div id="menu">
916abb21d0a6653e0187b91591e492026886b0a4Lennart Poettering <%@ include file="menu.jspf"%>
b23de6af893c11da4286bc416455cd0926d1532eLennart Poettering</div>
b23de6af893c11da4286bc416455cd0926d1532eLennart Poettering<div id="results">
21bdae12e11ae20460715475d8a0c991f15464acLennart Poettering<%
21bdae12e11ae20460715475d8a0c991f15464acLennart Poettering//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
9534ce54858c67363b841cdbdc315140437bfdb4Lennart Poetteringif( hits == null || errorMsg != null) {
9534ce54858c67363b841cdbdc315140437bfdb4Lennart Poettering %><%=errorMsg%><%
c798c40ec957a35cd4b7d04a196a9e58880c6ff3Lennart Poettering } else if (hits.length == 0) {
c798c40ec957a35cd4b7d04a196a9e58880c6ff3Lennart Poettering File spellIndex = new File(env.getDataRootPath(), "spellIndex");
68c7d001f4117f0c3d0a4582e32cbb03ae5fac57Lennart Poettering File[] spellIndexes=null;
68c7d001f4117f0c3d0a4582e32cbb03ae5fac57Lennart Poettering
68c7d001f4117f0c3d0a4582e32cbb03ae5fac57Lennart Poettering if (RuntimeEnvironment.getInstance().hasProjects()) {
7a2a0b907b5cc60f5d9a871997d7d6e7f62bf4d8Lennart Poettering if (project.size() > 1) { //more projects
253ee27a0c7a410d27d490bb79ea97caed6a2b68Lennart Poettering spellIndexes = new File[project.size()];
5d0fcd7c8d29340ac9425c309e8ac436a9af699cLennart Poettering int ii = 0;
5d0fcd7c8d29340ac9425c309e8ac436a9af699cLennart Poettering //TODO might need to rewrite to Project instead of String , need changes in projects.jspf too
acb14d318b84bda00d1e666d7dab6794d5bbeb3fLennart Poettering for (String proj : project) {
8bbabc447b1d913bd21faf97c7b17d20d315d2b4Lennart Poettering spellIndexes[ii++] = new File(spellIndex,proj);
8bbabc447b1d913bd21faf97c7b17d20d315d2b4Lennart Poettering }
8bbabc447b1d913bd21faf97c7b17d20d315d2b4Lennart Poettering } else { // just 1 project selected
73090dc815390f4fca4e3ed8a7e1d3806605daaaLennart Poettering spellIndex = new File(spellIndex, project.get(0));
44143309dd0b37d61d7d842ca58f01a65646ec71Kay Sievers }
3d57c6ab801f4437f12948e29589e3d00c3ad9dbLennart Poettering }
b9a2a36b519ccd79c4198e7dda4e657d597a14adLennart Poettering
b9a2a36b519ccd79c4198e7dda4e657d597a14adLennart Poettering int count=1;
ba1a55152c50dfbcd3d4a64353b95f4a2f37985eLennart Poettering if (spellIndexes!=null) {count=spellIndexes.length;}
9408a2d295a312a5472345090e28e0502570494bLennart Poettering
71092d70af35567dd154d3de2ce04ce62e157a7cLennart Poettering for (int idx = 0; idx < count; idx++) {
3f7a8c4e9f1d3ce48919e24eb2c9d56dd6fd88d8Kay Sievers
f9276855a1d270b6c3f857cdaf2c4b49920c2228Lennart Poettering if (spellIndexes!=null) spellIndex = spellIndexes[idx];
f9276855a1d270b6c3f857cdaf2c4b49920c2228Lennart Poettering
260abb780a135e4cae8c10715c7e85675efc345aLennart Poettering if (spellIndex.exists()) {
260abb780a135e4cae8c10715c7e85675efc345aLennart Poettering FSDirectory spellDirectory = FSDirectory.getDirectory(spellIndex);
260abb780a135e4cae8c10715c7e85675efc345aLennart Poettering SpellChecker checker = new SpellChecker(spellDirectory);
2791a8f8dc8764a9247cdba3562bd4c04010f144Lennart Poettering
a8f11321c209830a35edd0357e8def5d4437d854Lennart Poettering Date sstart = new Date();
a8f11321c209830a35edd0357e8def5d4437d854Lennart Poettering boolean printHeader = true;
21bdae12e11ae20460715475d8a0c991f15464acLennart Poettering String[] toks;
21bdae12e11ae20460715475d8a0c991f15464acLennart Poettering if(q != null) {
Error!

 

There was an error!

null

java.lang.NullPointerException