-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSearcher.java
More file actions
138 lines (118 loc) · 5.41 KB
/
Searcher.java
File metadata and controls
138 lines (118 loc) · 5.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.util.WordlistLoader;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.*;
import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
/**
* Servlet implementation class HomePage
*/
public class Searcher extends HttpServlet {
private static final long serialVersionUID = 1L;
public static Document hitDoc;
public static IndexSearcher is;
public static ScoreDoc[] hits;
public static String indexDir = "C:\\Users\\stavros\\Documents\\SearchEngine\\index_directory";
/**
* @see HttpServlet#HttpServlet()
*/
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Set response content type
response.setContentType("text/html");
String searchTerm = "";
String[] actValues = request.getParameterValues("activities");
String[] sightValues = request.getParameterValues("sightseeing");
try{
for(int i=0;i<actValues.length;i++)
{
searchTerm = searchTerm + actValues[i] + " ";
}
for(int i=0;i<sightValues.length;i++)
{
searchTerm = searchTerm + sightValues[i] + " ";
}
}catch (NullPointerException e){
ServletContext sc = this.getServletContext();
RequestDispatcher rd = sc.getRequestDispatcher("/search.jsp");
return;
}
System.out.println(searchTerm);
searchTerm.substring(searchTerm.length() - 1, searchTerm.length());
if (searchTerm==null || searchTerm.isEmpty())
{
ServletContext sc = this.getServletContext();
RequestDispatcher rd = sc.getRequestDispatcher("/search.jsp");
rd.forward(request, response);
return;
}
/*Ορισμός καταλόγου που βρίσκεται το index (παράμετρος). Θα χρησιμοποιηθεί στην ανάκτηση. Ακόμα, ορίζουμε το αρχείο
*common words, προκειμένου να τις παραλήψουμε από το ερώτημα.*/
File path = new File(indexDir);
Directory dir = FSDirectory.open(path);
IndexReader dr = DirectoryReader.open(dir);
is = new IndexSearcher(dr);
File common = new File(indexDir.substring(0, indexDir.length()-15) + "common_words");
FileReader reader = new FileReader(common);
/*Ορίζουμε τα πεδία στα οποία θα εκτελέσουμε την αναζήτηση*/
String[] fields = {"title","description","activities", "sightseeing"};
Analyzer analyzer = new MyAnalyzer(Version.LUCENE_47, WordlistLoader.getWordSet(reader, Version.LUCENE_47));
MultiFieldQueryParser parser = new MultiFieldQueryParser(Version.LUCENE_47, fields, analyzer);
Query q = null;
try {
q = parser.parse(searchTerm);
} catch (Exception e) {
e.printStackTrace();
}
long start = System.currentTimeMillis();
hits = is.search(q, null, 30).scoreDocs;
long end = System.currentTimeMillis();
//System.err.println("Found " + hits.length + " document(s) (in " + (end - start) + " miliseconds) that match the query: '" + searchTerm + "'.");
List<String> results = new ArrayList<String>();
if (hits.length > 0)
{
/*Για κάθε ένα από τα ανακτημένα i συγγράμματα*/
for (int i=0; i < hits.length; i++){
hitDoc = is.doc(hits[i].doc);
results.add("#new#");
/*Εμφάνιση τίτλου συγγράμματος και αριθμού στην διεπαφή.*/
results.add(hitDoc.get("title"));
/*Εμφάνιση συγγραφέα συγγράμματος στην διεπαφή.*/
results.add(hitDoc.get("description"));
/*Εμφάνιση περιγραφής συγγράμματος στην διεπαφή.*/
results.add(hitDoc.get("activities"));
results.add(hitDoc.get("sightseeing"));
/*Εμφάνιση γενικών πληροφοριών ανάκτησης, όπως αριθμό κειμένων και διάρκεια.*/
//System.out.println("Found " + hits.length + " document(s) (in " + (end - start) + " miliseconds) that match the query: '" + searchTerm + "'.");
}
}
else
results.add("No document(s) found (in " + (end - start) + " miliseconds) that match the query: '" + searchTerm + "'.");
ServletContext sc = this.getServletContext();
request.setAttribute("searcher", results);
RequestDispatcher rd = sc.getRequestDispatcher("/results.jsp");
rd.forward(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}