2013-04-01 57 views
0

我已經在JSP中構建了一個Web界面,用戶可以鍵入她的查詢,並且界面記錄用戶的查詢以及她的當前位置,並將這些查詢傳遞給Lucene索引搜索器SearchDB作爲參數。現在我想在同一個JSP中將頁面搜索結果返回到頁面。 JSP和Lucene索引搜索,我寫了服用其他職位的幫助的代碼,如下所示:如何在JSP中以頁面方式顯示Lucene indexsearcher的結果

result.jsp中

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.util.*,java.io.*,parser.SearchDB,org.apache.lucene.analysis.*" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
    <%! String myQuery; String city; String latitude; String longitude; %> 
    <% 
     myQuery=request.getParameter("myQuery"); 
     city=request.getParameter("city"); 
     latitude=request.getParameter("latitude"); 
     longitude=request.getParameter("longitude"); 
     Cookie cookies [] = request.getCookies(); 
     Cookie myCity=null; 
     Cookie myLat=null; 
     Cookie myLong=null; 
     if(city!=null) 
     { 
     myCity=new Cookie("city",city); 
     myCity.setMaxAge(365*24*60*60); 
     response.addCookie(myCity); 
     myLat=new Cookie("latitude",latitude); 
     myLat.setMaxAge(365*24*60*60); 
     response.addCookie(myLat); 
     myLong=new Cookie("longitude",longitude); 
     myLong.setMaxAge(365*24*60*60); 
     response.addCookie(myLong); 
     } 
    else 
     { 
     for (int i = 0; i < cookies.length; i++) 
     { 
       if (cookies[i].getName().equals("city")) 
        { 
        myCity=cookies[i]; 
        city=myCity.getValue(); 
        } 
       else 
       if(cookies[i].getName().equals("latitude")) 
       { 
         myLat=cookies[i]; 
         latitude=myLat.getValue(); 
       } 
       else 
        if(cookies[i].getName().equals("longitude")) 
        { 
         myLong=cookies[i]; 
         longitude=myLong.getValue(); 
        } 
      } 
    } 
    SearchDB s = new SearchDB(); 
    System.out.println("Query="+myQuery+" and City="+city); 
    s.searchdb(myQuery, city); 
%> 

<form name="frm" method="post" action="result.jsp"> 
<table width="100%" border="0" cellspacing="0" cellpadding="0"> 
    <tr> 
    <td width="22%">&nbsp;</td> 
    <td width="78%">&nbsp;</td> 
    </tr> 
    <tr> 
    <td>&nbsp; </td> 
    <td><input type="text" name="myQuery" placeholder="Type here"></td> 
    </tr> 
    <tr> 
    <td>&nbsp;</td> 
    <td><input type="submit" name="submit" value="Submit"></td> 
    </tr> 
    <tr> 
    <td>&nbsp;</td> 
    <td>&nbsp;</td> 
    </tr> 
    </table> 
    </form> 
    <html> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
    <title>Insert title here</title> 
    </head> 
    <body> 
    <p>Query phrase is : <%=myQuery%></p> 
    <p>User's city : <%=city%></p> 
    <p>User's latitude : <%=latitude%></p> 
    <p>User's longitude : <%=longitude%></p> 
    </body> 
    </html> 

SearchDB.java

package parser; 


public class SearchDB { 

public void searchdb(String myQuery, String myCity) throws Exception 
{ 
    System.out.println("Searching in the database ..."); 
    StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_CURRENT); 

    QueryParser cityQP = new QueryParser(Version.LUCENE_CURRENT, "city", analyzer); 
    Query cityQuery = cityQP.parse(myCity); 

    QueryParser titleQP = new QueryParser(Version.LUCENE_CURRENT, "title", analyzer); 
    Query titleQuery = titleQP.parse(myQuery); 

    BooleanQuery finalQuery = new BooleanQuery(); 
    finalQuery.add(cityQuery, Occur.MUST); must occur. 
    finalQuery.add(titleQuery, Occur.MUST); 

    System.out.println("Final Query="+finalQuery.toString()); 

    Directory dir=FSDirectory.open(new File(path of index directory")); 
    IndexSearcher searcher = new IndexSearcher(dir, true); 
    TopDocs hits = searcher.search(finalQuery, 20); 

    System.out.println("Number of hits="+hits.totalHits); 
    for(ScoreDoc match : hits.scoreDocs) 
    { 
     System.out.println(searcher.doc(match.doc).get("title")+" with score="+match.score); 
     System.out.println("_______"); 
    } 
    searcher.close(); 
    dir.close(); 
} 

}

我是Lucene和JSP的新手。我不知道應該對上面的JAVA和JSP代碼進行哪些更改,以便結果單獨顯示。所以,任何幫助表示讚賞。謝謝。

+0

1)有多少結果每次查詢最多是可能的:10S/100S /或幾千? 2)你是否熟悉像javascript,ajax這樣的前端? – phani

+0

每個查詢的結果可能最多爲100秒。我在JavaScript中完成了一點編碼,但我對Ajax並不熟悉。 – Joy

回答

0

您可以將獲得的最後一個ScoreDoc傳遞給IndexSearcher.searchAfter,以獲取下一組文檔。因此,在完成for循環之後匹配的值應該是傳遞給SearchAfter的ScoreDoc。

如:

TopDocs hits = searcher.search(finalQuery, 20); 
System.out.println("Number of hits="+hits.totalHits); 

while(not done paging...) { 
    ScoreDoc last; 
    for(ScoreDoc match : hits.scoreDocs) 
    { 
     System.out.println(searcher.doc(match.doc).get("title")+" with score="+match.score); 
     System.out.println("_______"); 
     last = match; 
    } 
    hits = searcher.searchAfter(last, finalQuery, 20); 
} 
+0

你已經告訴過如何分頁Lucene的結果,但我也想知道如何以頁面方式顯示它們,如Google或JSP中的任何標準搜索引擎。 – Joy