search.jsp revision 986
cd348e325366620fe047edcc849e3c9424828599Peter BrayCDDL HEADER START
cd348e325366620fe047edcc849e3c9424828599Peter BrayThe contents of this file are subject to the terms of the
d2a02e104622a26dd90fa88f4f17188f2039809fPeter BrayCommon Development and Distribution License (the "License").
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir KotalYou may not use this file except in compliance with the License.
d2a02e104622a26dd90fa88f4f17188f2039809fPeter BraySee LICENSE.txt included in this distribution for the specific
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Braylanguage governing permissions and limitations under the License.
983523cf73bc85cce6282cb5aa78b60f6bcd959fLubos KoscoWhen distributing Covered Code, include this CDDL HEADER in each
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Brayfile and include the License file at LICENSE.txt.
d2a02e104622a26dd90fa88f4f17188f2039809fPeter BrayIf applicable, add the following below this CDDL HEADER, with the
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Brayfields enclosed by brackets "[]" replaced with your own identifying
c577d2f6c082eaff9af5bc997d12f3d3bcef537cPeter Brayinformation: Portions Copyright [yyyy] [name of copyright owner]
d2a02e104622a26dd90fa88f4f17188f2039809fPeter BrayCDDL HEADER END
d2a02e104622a26dd90fa88f4f17188f2039809fPeter BrayCopyright 2010 Sun Microsystems, Inc. All rights reserved.
c577d2f6c082eaff9af5bc997d12f3d3bcef537cPeter BrayUse is subject to license terms.
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray--%><%@ page import = "javax.servlet.*,
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotalorg.apache.lucene.search.TopScoreDocCollector,
65df1e87266301e243dcead8082ca6255abea666Vladimir Kotal%><%@ page session="false" %><%@ page errorPage="error.jsp" %><%
65df1e87266301e243dcead8082ca6255abea666Vladimir KotalDate starttime = new Date();
425278cfacbc73f1e955ab6016f206fc5ed93ccbVladimir KotalString defs = request.getParameter("defs");
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir KotalString refs = request.getParameter("refs");
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir KotalString hist = request.getParameter("hist");
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir KotalString path = request.getParameter("path");
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal%><%@ include file="projects.jspf" %><%
6ce0623fa4ef95af9d77700a1c9c19ec1a919326Guillaume SmetString sort = null;
56c25decc0427c204cd35856e521ddf28337e75dLubos Koscofinal String LASTMODTIME = "lastmodtime";
56c25decc0427c204cd35856e521ddf28337e75dLubos Koscofinal String RELEVANCY = "relevancy";
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotalfinal String BY_PATH = "fullpath";
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotalfinal SortField S_BY_PATH = new SortField(BY_PATH,SortField.STRING);
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir KotalCookie[] cookies = request.getCookies();
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotalif (cookies != null) {
83439b4ed8fe40097dc3f2c05168d26bd7926159Vladimir Kotal for (Cookie cookie : cookies) {
83439b4ed8fe40097dc3f2c05168d26bd7926159Vladimir Kotal if (cookie.getName().equals("OpenGrok/sorting")) {
3ba66fbb56ef22f183da783a1b2718280c357a4eStanislav Kozina if (!LASTMODTIME.equals(sort) && !RELEVANCY.equals(sort) && !BY_PATH.equals(sort)) {
3ba66fbb56ef22f183da783a1b2718280c357a4eStanislav Kozina sort = RELEVANCY;
983523cf73bc85cce6282cb5aa78b60f6bcd959fLubos KoscoString sortParam = request.getParameter("sort");
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotalif (sortParam != null) {
c577d2f6c082eaff9af5bc997d12f3d3bcef537cPeter Bray if (LASTMODTIME.equals(sortParam)) {
c577d2f6c082eaff9af5bc997d12f3d3bcef537cPeter Bray sort = LASTMODTIME;
c577d2f6c082eaff9af5bc997d12f3d3bcef537cPeter Bray } else if (RELEVANCY.equals(sortParam)) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray sort = RELEVANCY;
0ca9a2c194523c517c3aafe5758e217ac88d6baaLubos Kosco } else if (BY_PATH.equals(sortParam)) {
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal sort = BY_PATH;
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal if (sort != null) {
cd348e325366620fe047edcc849e3c9424828599Peter Bray Cookie cookie = new Cookie("OpenGrok/sorting", sort);
cd348e325366620fe047edcc849e3c9424828599Peter Bray} else { sort = RELEVANCY; }
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal//List<org.apache.lucene.document.Document> docs=new ArrayList<org.apache.lucene.document.Document>();
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir KotalString errorMsg = null;
fbf97ea1786d1e25add88bbfb91810170473bc9fLubos Koscoif( q!= null && q.equals("")) q = null;
3a4816d2417e1abe89a913616de36f200793bea3Vladimir Kotalif( defs != null && defs.equals("")) defs = null;
fbf97ea1786d1e25add88bbfb91810170473bc9fLubos Koscoif( refs != null && refs.equals("")) refs = null;
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotalif( hist != null && hist.equals("")) hist = null;
3a4816d2417e1abe89a913616de36f200793bea3Vladimir Kotalif( path != null && path.equals("")) path = null;
fbf97ea1786d1e25add88bbfb91810170473bc9fLubos Koscoif (project != null && project.size()<1) project = null;
fbf97ea1786d1e25add88bbfb91810170473bc9fLubos Koscoif (q != null || defs != null || refs != null || hist != null || path != null) {
fbf97ea1786d1e25add88bbfb91810170473bc9fLubos Kosco Searcher searcher = null; //the searcher used to open/search the index
fbf97ea1786d1e25add88bbfb91810170473bc9fLubos Kosco TopScoreDocCollector collector=null; // the collector used
f21b682cd9b414738a4f5a38b56f6682e537e1d2Trond Norbye ScoreDoc[] hits = null; // list of documents which result from the query
3b0448fdd830b8d04c6a71511e5d26a4fc3b5b80Lubos Kosco IndexReader ireader = null; //the reader used to open/search the index
3b0448fdd830b8d04c6a71511e5d26a4fc3b5b80Lubos Kosco Query query = null; //the Query created by the QueryBuilder
cd348e325366620fe047edcc849e3c9424828599Peter Bray boolean allCollected=false;
cd348e325366620fe047edcc849e3c9424828599Peter Bray int totalHits=0;
cd348e325366620fe047edcc849e3c9424828599Peter Bray int start = 0; //the first index displayed on this page
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray //TODO deprecate max this and merge with paging and param n - TEST needed
cd348e325366620fe047edcc849e3c9424828599Peter Bray //int max = 25; //the maximum items displayed on this page
c276b1ec9722ee95a86a4a381b39c5f405fc1cc4Vladimir Kotal int max=RuntimeEnvironment.getInstance().getHitsPerPage();
c276b1ec9722ee95a86a4a381b39c5f405fc1cc4Vladimir Kotal int hitsPerPage = RuntimeEnvironment.getInstance().getHitsPerPage();
c276b1ec9722ee95a86a4a381b39c5f405fc1cc4Vladimir Kotal int cachePages= RuntimeEnvironment.getInstance().getCachePages();
c276b1ec9722ee95a86a4a381b39c5f405fc1cc4Vladimir Kotal final boolean docsScoredInOrder=false;
2cf31ec93bd5d8a2efeab511ce051da51e69aedaLubos Kosco int thispage = 0; //used for the for/next either max or
c276b1ec9722ee95a86a4a381b39c5f405fc1cc4Vladimir Kotal QueryBuilder queryBuilder =
2cf31ec93bd5d8a2efeab511ce051da51e69aedaLubos Kosco new QueryBuilder()
0ca9a2c194523c517c3aafe5758e217ac88d6baaLubos Kosco .setFreetext(q).setDefs(defs).setRefs(refs)
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray .setPath(path).setHist(hist);
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray String DATA_ROOT = env.getDataRootPath();
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray throw new Exception("DATA_ROOT parameter is not configured in web.xml!");
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray File data_root = new File(DATA_ROOT);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray throw new Exception("DATA_ROOT parameter in web.xml does not exist or is not a directory!");
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray //String date = request.getParameter("date");
cd348e325366620fe047edcc849e3c9424828599Peter Bray //TODO merge paging hitsPerPage with parameter n (has to reflect the search if changed so proper number is cached first time)
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray start = Integer.parseInt(request.getParameter("start")); //parse the max results first
cd348e325366620fe047edcc849e3c9424828599Peter Bray max = Integer.parseInt(request.getParameter("n")); //then the start index
cd348e325366620fe047edcc849e3c9424828599Peter Bray if(max < 0 || (max % 10 != 0) || max > 50) max = 25;
cd348e325366620fe047edcc849e3c9424828599Peter Bray if(start < 0 ) start = 0;
cd348e325366620fe047edcc849e3c9424828599Peter Bray } catch (Exception e) { }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray File root = new File(RuntimeEnvironment.getInstance().getDataRootFile(),
0ca9a2c194523c517c3aafe5758e217ac88d6baaLubos Kosco if (RuntimeEnvironment.getInstance().hasProjects()) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if (project == null) {
0ca9a2c194523c517c3aafe5758e217ac88d6baaLubos Kosco errorMsg = "<b>Error:</b> You must select a project!";
5762c9f28c2246777be0e9d49cb29d9c0f49146dLubos Kosco if (project.size() > 1) { //more projects
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray IndexSearcher[] searchables = new IndexSearcher[project.size()];
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray File droot = new File(RuntimeEnvironment.getInstance().getDataRootFile(), "index");
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray //TODO might need to rewrite to Project instead of String , need changes in projects.jspf too
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray for (String proj : project) {
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray ireader = (IndexReader.open(FSDirectory.open(new File(droot, proj)),true));
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray searchables[ii++] = new IndexSearcher(ireader);
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray if (Runtime.getRuntime().availableProcessors() > 1) {
b34561d2c3d92fac37dbced05ba6a8738e3d20e9Lubos Kosco searcher = new ParallelMultiSearcher(searchables);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray searcher = new MultiSearcher(searchables);
c83dfde6b364917fa8ed28142d509a7c29a4da68Vladimir Kotal } else { // just 1 project selected
c83dfde6b364917fa8ed28142d509a7c29a4da68Vladimir Kotal root = new File(root, project.get(0));
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray ireader = IndexReader.open(FSDirectory.open(root),true);
cd348e325366620fe047edcc849e3c9424828599Peter Bray searcher = new IndexSearcher(ireader);
cd348e325366620fe047edcc849e3c9424828599Peter Bray } else { //no project setup
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray ireader = IndexReader.open(FSDirectory.open(root),true);
cd348e325366620fe047edcc849e3c9424828599Peter Bray searcher = new IndexSearcher(ireader);
cd348e325366620fe047edcc849e3c9424828599Peter Bray //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 ;)
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if (errorMsg == null) {
cd348e325366620fe047edcc849e3c9424828599Peter Bray collector = TopScoreDocCollector.create(hitsPerPage*cachePages,docsScoredInOrder);
0b2998be561e7bf5e3479d686a5af36f712b0d9aVladimir Kotal Sort sortf = new Sort(new SortField("date",SortField.STRING,true));
cd348e325366620fe047edcc849e3c9424828599Peter Bray TopFieldDocs fdocs=searcher.search(query, null,hitsPerPage*cachePages, sortf);
cd348e325366620fe047edcc849e3c9424828599Peter Bray if (start>=hitsPerPage*cachePages && !allCollected) { //fetch ALL results only if above cachePages
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray fdocs=searcher.search(query, null, totalHits, sortf);
cd348e325366620fe047edcc849e3c9424828599Peter Bray allCollected=true;
c842732324ee4c74ede17887ad1f0dcdc4364a2cLubos Kosco } else if (BY_PATH.equals(sort)) {
c842732324ee4c74ede17887ad1f0dcdc4364a2cLubos Kosco Sort sortf = new Sort(S_BY_PATH);
c842732324ee4c74ede17887ad1f0dcdc4364a2cLubos Kosco TopFieldDocs fdocs=searcher.search(query, null,hitsPerPage*cachePages, sortf);
c842732324ee4c74ede17887ad1f0dcdc4364a2cLubos Kosco if (start>=hitsPerPage*cachePages && !allCollected) { //fetch ALL results only if above cachePages
c842732324ee4c74ede17887ad1f0dcdc4364a2cLubos Kosco fdocs=searcher.search(query, null,totalHits, sortf);
c842732324ee4c74ede17887ad1f0dcdc4364a2cLubos Kosco allCollected=true;
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal searcher.search(query,collector);
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal if (start>=hitsPerPage*cachePages && !allCollected) { //fetch ALL results only if above cachePages
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal collector = TopScoreDocCollector.create(totalHits,docsScoredInOrder);
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal searcher.search(query,collector);
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal allCollected=true;
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray hits=collector.topDocs().scoreDocs;
3aa0947feb67d3e8292d84776638be98dd97fdc3Lubos Kosco //below will get all the documents
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray// for (int i = 0; i < hits.length; i++) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray// int docId = hits[i].doc;
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray// Document d = searcher.doc(docId);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray thispage = max;
d961aa46ea0d50fed47802497e45226b1965b12dVladimir Kotal errorMsg = "<b>Error:</b> Too many results for wildcard!";
e9dbb478e3339d96ce4f0af5c6ab7e1d35ebb86dVladimir Kotal } catch (ParseException e) {
d961aa46ea0d50fed47802497e45226b1965b12dVladimir Kotal errorMsg = "<b>Error parsing your query</b>" +
d961aa46ea0d50fed47802497e45226b1965b12dVladimir Kotal "<p/>You might try to enclose your search term in quotes, " +
d961aa46ea0d50fed47802497e45226b1965b12dVladimir Kotal "<a href=\"help.jsp#escaping\">escape special characters</a> " +
d961aa46ea0d50fed47802497e45226b1965b12dVladimir Kotal "with <b>\\</b>, or read the <a href=\"help.jsp\">Help</a> " +
d961aa46ea0d50fed47802497e45226b1965b12dVladimir Kotal "on the query language.<p/>" +
cd348e325366620fe047edcc849e3c9424828599Peter Bray "Error message from parser:<br/>" + Util.htmlize(e.getMessage());
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray } catch (FileNotFoundException e) {
cd348e325366620fe047edcc849e3c9424828599Peter Bray errorMsg = "<b>Error:</b> Index database not found";
cd348e325366620fe047edcc849e3c9424828599Peter Bray } catch (Exception e) {
cd348e325366620fe047edcc849e3c9424828599Peter Bray errorMsg = "<b>Error:</b> " + Util.htmlize(e.getMessage());
56d93b0c761868f813ac0bc0b5bc21a7a9fefd89Vladimir Kotal // Bug #3900: Check if this is a search for a single term, and that term
56d93b0c761868f813ac0bc0b5bc21a7a9fefd89Vladimir Kotal // is a definition. If that's the case, and we only have one match, we'll
4f3c0816485669143aa54f1c6461fcb47cf5bc5cVladimir Kotal // generate a direct link instead of a listing.
4f3c0816485669143aa54f1c6461fcb47cf5bc5cVladimir Kotal boolean isSingleDefinitionSearch =
2b024356b830395446c55f50f9f724a63612e578Lubos Kosco (query instanceof TermQuery) && (defs != null);
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray // Attempt to create a direct link to the definition if we search for one
17d95a647aba8c37d9ac34d97e4eed729aa46f67Naseer Ahmed // single definition term AND we have exactly one match AND there is only
17d95a647aba8c37d9ac34d97e4eed729aa46f67Naseer Ahmed // one definition of that symbol in the document that matches.
17d95a647aba8c37d9ac34d97e4eed729aa46f67Naseer Ahmed boolean uniqueDefinition = false;
5762c9f28c2246777be0e9d49cb29d9c0f49146dLubos Kosco if (isSingleDefinitionSearch && hits != null && hits.length == 1) {
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray Document doc = searcher.doc(hits[0].doc);
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray byte[] rawTags = doc.getFieldable("tags").getBinaryValue();
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray Definitions tags = Definitions.deserialize(rawTags);
5762c9f28c2246777be0e9d49cb29d9c0f49146dLubos Kosco String symbol = ((TermQuery) query).getTerm().text();
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if (tags.occurrences(symbol) == 1) {
d6ee3934a24d8ccc0e4bb478405d8e5f6a35825dLubos Kosco uniqueDefinition = true;
c842732324ee4c74ede17887ad1f0dcdc4364a2cLubos Kosco // @TODO fix me. I should try to figure out where the exact hit is instead
cd348e325366620fe047edcc849e3c9424828599Peter Bray // of returning a page with just _one_ entry in....
b17cb0705d90907337b3528aa7b8ed1700806f26Vladimir Kotal if (uniqueDefinition && request.getServletPath().equals("/s")) {
d6ee3934a24d8ccc0e4bb478405d8e5f6a35825dLubos Kosco String preFragmentPath = Util.URIEncodePath(context + "/xref" + searcher.doc(hits[0].doc).get("path"));
425278cfacbc73f1e955ab6016f206fc5ed93ccbVladimir Kotal String fragment = Util.URIEncode(((TermQuery)query).getTerm().text());
425278cfacbc73f1e955ab6016f206fc5ed93ccbVladimir Kotal StringBuilder url = new StringBuilder(preFragmentPath);
d70dc22c6dce3f498251b0873638d1fea0e644a3Lubos Kosco String pageTitle = "Search";
d70dc22c6dce3f498251b0873638d1fea0e644a3Lubos Kosco RuntimeEnvironment environment = RuntimeEnvironment.getInstance();
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray %><%@ include file="httpheader.jspf" %>
2cf31ec93bd5d8a2efeab511ce051da51e69aedaLubos Kosco<div id="page">
2cf31ec93bd5d8a2efeab511ce051da51e69aedaLubos Kosco <div id="header"><%@ include file="pageheader.jspf" %></div>
2cf31ec93bd5d8a2efeab511ce051da51e69aedaLubos Kosco<div id="Masthead"></div>
2cf31ec93bd5d8a2efeab511ce051da51e69aedaLubos Kosco<div id="bar">
2cf31ec93bd5d8a2efeab511ce051da51e69aedaLubos Kosco <table border="0" width="100%"><tr><td><a href="<%=context%>" id="home">Home</a></td><td align="right"><%
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray String url = "search?";
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray url = url + (q == null ? "" : "&q=" + Util.URIEncode(q)) +
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray (defs == null ? "" : "&defs=" + Util.URIEncode(defs)) +
1a5c2ab40bd94d2b2c63afda767ce7bbf29ecc4bJan Friedel (refs == null ? "" : "&refs=" + Util.URIEncode(refs)) +
5762c9f28c2246777be0e9d49cb29d9c0f49146dLubos Kosco (path == null ? "" : "&path=" + Util.URIEncode(path)) +
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray (hist == null ? "" : "&hist=" + Util.URIEncode(hist));
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray if (hasProjects) {
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal if (project!=null) {
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal url = url + "&project=";
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal for (Iterator it = project.iterator(); it.hasNext();) {
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal url = url + (project == null ? "" : Util.URIEncode((String) it.next()) + ",");
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal %>Sort by: <%
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal url=url+("&sort=");
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal if (sort == null || RELEVANCY.equals(sort)) {
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal %><b>relevance</b> | <a href="<%=url+LASTMODTIME%>">last modified time</a> | <a href="<%=url+BY_PATH%>">path</a><%
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray } else if (LASTMODTIME.equals(sort)) {
6ce0623fa4ef95af9d77700a1c9c19ec1a919326Guillaume Smet %><a href="<%=url+RELEVANCY%>">relevance</a> | <b>last modified time</b> | <a href="<%=url+BY_PATH%>">path</a><%
6ce0623fa4ef95af9d77700a1c9c19ec1a919326Guillaume Smet } else if (BY_PATH.equals(sort)) {
6ce0623fa4ef95af9d77700a1c9c19ec1a919326Guillaume Smet %><a href="<%=url+RELEVANCY%>">relevance</a> | <a href="<%=url+LASTMODTIME%>">last modified time</a> | <b>path</b><%
6ce0623fa4ef95af9d77700a1c9c19ec1a919326Guillaume Smet %><a href="<%=url+RELEVANCY%>">relevance</a> | <a href="<%=url+LASTMODTIME%>">last modified time</a> | <a href="<%=url+BY_PATH%>">path</a><%
6ce0623fa4ef95af9d77700a1c9c19ec1a919326Guillaume Smet } %></td></tr></table>
cd71fb134e037849c77364b50940b1870c4684ceVladimir Kotal<div id="menu">
983523cf73bc85cce6282cb5aa78b60f6bcd959fLubos Kosco <%@ include file="menu.jspf"%>
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray<div id="results">
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray//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
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Brayif( hits == null || errorMsg != null) {
2b024356b830395446c55f50f9f724a63612e578Lubos Kosco %><%=errorMsg%><%
2b024356b830395446c55f50f9f724a63612e578Lubos Kosco } else if (hits.length == 0) {
2b024356b830395446c55f50f9f724a63612e578Lubos Kosco File spellIndex = new File(env.getDataRootPath(), "spellIndex");
2b024356b830395446c55f50f9f724a63612e578Lubos Kosco File[] spellIndexes=null;
0ca9a2c194523c517c3aafe5758e217ac88d6baaLubos Kosco if (RuntimeEnvironment.getInstance().hasProjects()) {
cd348e325366620fe047edcc849e3c9424828599Peter Bray if (project.size() > 1) { //more projects
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray spellIndexes = new File[project.size()];
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray //TODO might need to rewrite to Project instead of String , need changes in projects.jspf too
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray for (String proj : project) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray spellIndexes[ii++] = new File(spellIndex,proj);
2b024356b830395446c55f50f9f724a63612e578Lubos Kosco } else { // just 1 project selected
2b024356b830395446c55f50f9f724a63612e578Lubos Kosco spellIndex = new File(spellIndex, project.get(0));
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray int count=1;
cd348e325366620fe047edcc849e3c9424828599Peter Bray if (spellIndexes!=null) {count=spellIndexes.length;}
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray for (int idx = 0; idx < count; idx++) {
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray if (spellIndexes!=null) spellIndex = spellIndexes[idx];
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray FSDirectory spellDirectory = FSDirectory.open(spellIndex);
477c09a2656e6a2c1075425ad81e61d594164fa9Lubos Kosco SpellChecker checker = new SpellChecker(spellDirectory);
83439b4ed8fe40097dc3f2c05168d26bd7926159Vladimir Kotal Date sstart = new Date();
83439b4ed8fe40097dc3f2c05168d26bd7926159Vladimir Kotal boolean printHeader = true;
83439b4ed8fe40097dc3f2c05168d26bd7926159Vladimir Kotal String[] toks;
83439b4ed8fe40097dc3f2c05168d26bd7926159Vladimir Kotal if(q != null) {
477c09a2656e6a2c1075425ad81e61d594164fa9Lubos Kosco toks = q.split("[\t ]+");
cd348e325366620fe047edcc849e3c9424828599Peter Bray if(toks != null){
3ba66fbb56ef22f183da783a1b2718280c357a4eStanislav Kozina for(int j=0; j<toks.length; j++) {
3ba66fbb56ef22f183da783a1b2718280c357a4eStanislav Kozina if(toks[j].length() > 3) {
3ba66fbb56ef22f183da783a1b2718280c357a4eStanislav Kozina String[] ret = checker.suggestSimilar(toks[j].toLowerCase(), 5);
3ba66fbb56ef22f183da783a1b2718280c357a4eStanislav Kozina for(int i = 0;i < ret.length; i++) {
3ba66fbb56ef22f183da783a1b2718280c357a4eStanislav Kozina if (printHeader) {
3ba66fbb56ef22f183da783a1b2718280c357a4eStanislav Kozina %><p><font color="#cc0000">Did you mean(for <%=spellIndex.getName()%>)</font>:<%
3ba66fbb56ef22f183da783a1b2718280c357a4eStanislav Kozina printHeader = false;
cd348e325366620fe047edcc849e3c9424828599Peter Bray %> <a href=search?q=<%=ret[i]%>><%=ret[i]%></a> <%
cd348e325366620fe047edcc849e3c9424828599Peter Bray if(refs != null) {
cd348e325366620fe047edcc849e3c9424828599Peter Bray toks = refs.split("[\t ]+");
cd348e325366620fe047edcc849e3c9424828599Peter Bray if(toks != null){
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray for(int j=0; j<toks.length; j++) {
cd348e325366620fe047edcc849e3c9424828599Peter Bray if(toks[j].length() > 3) {
cd348e325366620fe047edcc849e3c9424828599Peter Bray String[] ret = checker.suggestSimilar(toks[j].toLowerCase(), 5);
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray for(int i = 0;i < ret.length; i++) {
c577d2f6c082eaff9af5bc997d12f3d3bcef537cPeter Bray if (printHeader) {
477c09a2656e6a2c1075425ad81e61d594164fa9Lubos Kosco %><p><font color="#cc0000">Did you mean(for <%=spellIndex.getName()%>)</font>:<%
4e854c69a0484765dcd27b0e837898c8b6969beaTrond Norbye printHeader = false;
c577d2f6c082eaff9af5bc997d12f3d3bcef537cPeter Bray %> <a href=search?refs=<%=ret[i]%>><%=ret[i]%></a> <%
3a5046f0538ba9fb3a9429199544a9f4b93d9a4dLubos Kosco //TODO it seems the only true spellchecker is for below field, see IndexDatabase createspellingsuggestions ...
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if(defs != null) {
cd348e325366620fe047edcc849e3c9424828599Peter Bray toks = defs.split("[\t ]+");
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if(toks != null){
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray for(int j=0; j<toks.length; j++) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if(toks[j].length() > 3) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray String[] ret = checker.suggestSimilar(toks[j].toLowerCase(), 5);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray for(int i = 0;i < ret.length; i++) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if (printHeader) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray %><p><font color="#cc0000">Did you mean(for <%=spellIndex.getName()%>)</font>:<%
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray printHeader = false;
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray %> <a href=search?defs=<%=ret[i]%>><%=ret[i]%></a> <%
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if (printHeader) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray %><p> Your search <b><%=query.toString()%></b> did not match any files.
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray Suggestions:<br/><blockquote>- Make sure all terms are spelled correctly.<br/>
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray - Try different keywords.<br/>
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray - Try more general keywords.<br/>
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray - Use 'wil*' cards if you are looking for partial match.
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray </blockquote>
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray } else { // We have a lots of results to show
c83dfde6b364917fa8ed28142d509a7c29a4da68Vladimir Kotal StringBuilder slider = null;
c83dfde6b364917fa8ed28142d509a7c29a4da68Vladimir Kotal if ( max < totalHits) {
c83dfde6b364917fa8ed28142d509a7c29a4da68Vladimir Kotal if((start + max) < totalHits) {
c83dfde6b364917fa8ed28142d509a7c29a4da68Vladimir Kotal thispage = max;
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray thispage = totalHits - start;
0ca9a2c194523c517c3aafe5758e217ac88d6baaLubos Kosco String urlp = (q == null ? "" : "&q=" + Util.URIEncode(q)) +
cd348e325366620fe047edcc849e3c9424828599Peter Bray (defs == null ? "" : "&defs=" + Util.URIEncode(defs)) +
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray (refs == null ? "" : "&refs=" + Util.URIEncode(refs)) +
cd348e325366620fe047edcc849e3c9424828599Peter Bray (path == null ? "" : "&path=" + Util.URIEncode(path)) +
cd348e325366620fe047edcc849e3c9424828599Peter Bray (hist == null ? "" : "&hist=" + Util.URIEncode(hist)) +
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray (sort == null ? "" : "&sort=" + Util.URIEncode(sort));
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if (hasProjects) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray urlp = urlp + "&project=";
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray for (Iterator it = project.iterator(); it.hasNext();) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray urlp = urlp + (project == null ? "" : Util.URIEncode((String) it.next()) + ",");
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray slider = new StringBuilder();
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray int labelStart =1;
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray int sstart = start - max* (start / max % 10 + 1) ;
d0767114e1a949e4a42358f5aeaa08590b87cd80Trond Norbye if(sstart < 0) {
d0767114e1a949e4a42358f5aeaa08590b87cd80Trond Norbye labelStart = 1;
d0767114e1a949e4a42358f5aeaa08590b87cd80Trond Norbye labelStart = sstart/max + 1;
d0767114e1a949e4a42358f5aeaa08590b87cd80Trond Norbye int label = labelStart;
d0767114e1a949e4a42358f5aeaa08590b87cd80Trond Norbye int labelEnd = label + 11;
d0767114e1a949e4a42358f5aeaa08590b87cd80Trond Norbye for(int i=sstart; i<totalHits && label <= labelEnd; i+= max) {
d0767114e1a949e4a42358f5aeaa08590b87cd80Trond Norbye if (i <= start && start < i+ max) {
d0767114e1a949e4a42358f5aeaa08590b87cd80Trond Norbye slider.append("<span class=\"sel\">" + label + "</span>");
d0767114e1a949e4a42358f5aeaa08590b87cd80Trond Norbye if(label == labelStart && label != 1) {
d0767114e1a949e4a42358f5aeaa08590b87cd80Trond Norbye arr = "<<";
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray } else if(label == labelEnd && i < totalHits) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray arr = ">>";
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal arr = label < 10 ? " " + label : String.valueOf(label);
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal slider.append("<a class=\"more\" href=\"s?n=" + max + "&start=" + i + urlp + "\">"+
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal arr + "</a>");
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal thispage = totalHits - start; // set the max index to max or last
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal %> Searched <b><%=query.toString()%></b> (Results <b><%=start+1%> -
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal <%=thispage+start%></b> of <b><%=totalHits%></b>) sorted by <%=sort%> <p><%=slider != null ?
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal <table width="100%" cellpadding="3" cellspacing="0" border="0"><%
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal Context sourceContext = null;
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal Summarizer summer = null;
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal if (query != null) {
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal sourceContext =
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal new Context(query, queryBuilder.getQueries());
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal if(sourceContext != null)
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal summer = new Summarizer(query,
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray new CompatibleAnalyser());
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray } catch (Exception e) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray HistoryContext historyContext = null;
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray historyContext = new HistoryContext(query);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray } catch (Exception e) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray EftarFileReader ef = null;
c276b1ec9722ee95a86a4a381b39c5f405fc1cc4Vladimir Kotal ef = new EftarFileReader(env.getDataRootPath() + "/index/dtags.eftar");
c276b1ec9722ee95a86a4a381b39c5f405fc1cc4Vladimir Kotal } catch (Exception e) {
c276b1ec9722ee95a86a4a381b39c5f405fc1cc4Vladimir Kotal //TODO also fix the way what and how it is passed to prettyprint, can improve performance! SearchEngine integration is really needed here.
4e854c69a0484765dcd27b0e837898c8b6969beaTrond Norbye Results.prettyPrintHTML(searcher,hits, start, start+thispage,
4e854c69a0484765dcd27b0e837898c8b6969beaTrond Norbye sourceContext, historyContext, summer,
4e854c69a0484765dcd27b0e837898c8b6969beaTrond Norbye context + "/xref",
4e854c69a0484765dcd27b0e837898c8b6969beaTrond Norbye context + "/more",
4e854c69a0484765dcd27b0e837898c8b6969beaTrond Norbye if(ef != null) {
a3a5f5c0500064f4c6ac3658b1e3e4d838912329Lubos Kosco } catch (IOException e) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray %></table><br/>
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray <b> Completed in <%=(new Date()).getTime() - starttime.getTime()%> milliseconds </b> <br/>
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray <%=slider != null ? "<p>" + slider + "</p>" : ""%>
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray %><br/></div><%@include file="foot.jspf"%><%
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if (ireader != null)
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray} else { // Entry page show the map