import
java.io.BufferedReader;
import
java.io.File;
import
java.io.IOException;
import
java.text.DateFormat;
import
java.text.SimpleDateFormat;
import
java.util.ArrayList;
import
java.util.Date;
import
org.apache.lucene.analysis.Analyzer;
import
org.apache.lucene.analysis.kr.KoreanAnalyzer;
import
org.apache.lucene.document.Document;
import
org.apache.lucene.index.DirectoryReader;
import
org.apache.lucene.index.IndexReader;
import
org.apache.lucene.queryparser.classic.ParseException;
import
org.apache.lucene.queryparser.classic.QueryParser;
import
org.apache.lucene.search.Explanation;
import
org.apache.lucene.search.IndexSearcher;
import
org.apache.lucene.search.Query;
import
org.apache.lucene.search.ScoreDoc;
import
org.apache.lucene.search.TopDocs;
import
org.apache.lucene.search.vectorhighlight.BaseFragmentsBuilder;
import
org.apache.lucene.search.vectorhighlight.FastVectorHighlighter;
import
org.apache.lucene.search.vectorhighlight.FragListBuilder;
import
org.apache.lucene.search.vectorhighlight.FragmentsBuilder;
import
org.apache.lucene.search.vectorhighlight.ScoreOrderFragmentsBuilder;
import
org.apache.lucene.search.vectorhighlight.SimpleFragListBuilder;
import
org.apache.lucene.store.FSDirectory;
import
org.apache.lucene.util.Version;
public
class
SearchOpenDBMS {
private
static
Analyzer analyzer =
new
KoreanAnalyzer();
public
static
ArrayList<SearchOpenTable> searchLucene(String indexDir, String field, String kwd
,
int
repeat,
int
hitsPerPage,
boolean
raw,
boolean
interactive)
throws
IOException, ParseException{
IndexReader reader = DirectoryReader.open(FSDirectory.open(
new
File(indexDir)));
IndexSearcher searcher =
new
IndexSearcher(reader);
BufferedReader in =
null
;
QueryParser parser =
new
QueryParser(Version.LUCENE_42, field, analyzer);
ArrayList<SearchOpenTable> list =
new
ArrayList<SearchOpenTable>();
while
(
true
) {
String line = kwd !=
null
? kwd :
""
;
if
(line ==
null
|| line.length() == -
1
) {
break
;
}
line = line.trim();
if
(line.length() ==
0
) {
break
;
}
Query query = parser.parse(line);
System.out.println(
"### Searching for: "
+ query.toString(field));
if
(repeat >
0
) {
Date start =
new
Date();
for
(
int
i =
0
; i < repeat; i++) {
searcher.search(query,
null
,
100
);
}
Date end =
new
Date();
System.out.println(
"Time: "
+(end.getTime()-start.getTime())+
"ms"
);
}
LuceneSearchResult result =
null
;
try
{
Date start =
new
Date();
result = doPagingSearch(in, searcher, query, hitsPerPage, raw, interactive);
Date end =
new
Date();
DateFormat formatter =
new
SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss"
);
System.out.println(
"# Start-Time: "
+formatter.format(start)+
", End-Time: "
+formatter.format(end));
System.out.println(
"# Elapse-Time: "
+(end.getTime()-start.getTime())+
"ms"
);
}
catch
(IOException e) {
e.printStackTrace();
}
for
(
int
i=
0
; i<result.getSize(); i++){
SearchOpenTable searchDev =
new
SearchOpenTable();
searchDev.setSeq(result.getDocument(i).get(
"SEQ"
));
searchDev.setTitle(result.getDocument(i).get(
"TITLE"
));
searchDev.setContent(result.getDocument(i).get(
"CONTENT"
));
list.add(searchDev);
}
if
(kwd !=
null
) {
break
;
}
}
reader.close();
return
list;
}
public
static
LuceneSearchResult doPagingSearch(BufferedReader in, IndexSearcher searcher, Query query,
int
hitsPerPage,
boolean
raw,
boolean
interactive)
throws
IOException {
SortField sortField =
new
SortField(
"SEQ"
, SortField.Type.STRING,
true
);
Sort sort =
new
Sort(sortField);
TopDocs results = searcher.search(query,
5
* hitsPerPage, sort);
ScoreDoc[] hits = results.scoreDocs;
int
cnt =
1
;
for
(ScoreDoc match : results.scoreDocs) {
Document doc = searcher.doc(match.doc);
Explanation explanation = searcher.explain(query, match.doc);
System.out.println(
"----------------START-("
+cnt+
")------------------"
);
System.out.println(
"### POST SEQ : "
+doc.get(
"SEQ"
)+
", POST TITLE :"
+doc.get(
"TITLE"
));
System.out.println(
"### Explan :"
+explanation.toString());
System.out.println(
"-----------------END-("
+cnt+
")-------------------"
);
++cnt;
}
int
numTotalHits = results.totalHits;
System.out.println(numTotalHits +
" total matching documents"
);
int
start =
0
;
int
end = Math.min(numTotalHits, hitsPerPage);
while
(
true
) {
if
(end > hits.length) {
System.out.println(
"Only results 1 - "
+ hits.length +
" of "
+ numTotalHits +
" total matching documents collected."
);
System.out.println(
"Collect more (y/n) ?"
);
String line = in.readLine();
if
(line.length() ==
0
|| line.charAt(
0
) ==
'n'
) {
break
;
}
hits = searcher.search(query, numTotalHits).scoreDocs;
}
end = Math.min(hits.length, start + hitsPerPage);
for
(
int
i = start; i < end; i++) {
if
(raw) {
System.out.println(
"doc="
+hits[i].doc+
" score="
+hits[i].score);
continue
;
}
}
if
(!interactive || end ==
0
) {
break
;
}
if
(numTotalHits >= end) {
boolean
quit =
false
;
while
(
true
) {
System.out.print(
"Press "
);
if
(start - hitsPerPage >=
0
) {
System.out.print(
"(p)revious page, "
);
}
if
(start + hitsPerPage < numTotalHits) {
System.out.print(
"(n)ext page, "
);
}
System.out.println(
"(q)uit or enter number to jump to a page."
);
String line = in.readLine();
if
(line.length() ==
0
|| line.charAt(
0
)==
'q'
) {
quit =
true
;
break
;
}
if
(line.charAt(
0
) ==
'p'
) {
start = Math.max(
0
, start - hitsPerPage);
break
;
}
else
if
(line.charAt(
0
) ==
'n'
) {
if
(start + hitsPerPage < numTotalHits) {
start+=hitsPerPage;
}
break
;
}
else
{
int
page = Integer.parseInt(line);
if
((page -
1
) * hitsPerPage < numTotalHits) {
start = (page -
1
) * hitsPerPage;
break
;
}
else
{
System.out.println(
"No such page"
);
}
}
}
if
(quit)
break
;
end = Math.min(numTotalHits, start + hitsPerPage);
}
}
return
new
LuceneSearchResult(searcher, hits);
}
static
FastVectorHighlighter getHighlighter() {
FragListBuilder fragListBuilder =
new
SimpleFragListBuilder();
FragmentsBuilder fragmentBuilder =
new
ScoreOrderFragmentsBuilder(
BaseFragmentsBuilder.COLORED_PRE_TAGS,
BaseFragmentsBuilder.COLORED_POST_TAGS);
return
new
FastVectorHighlighter(
true
,
true
, fragListBuilder, fragmentBuilder);
}
public
static
void
main(String[] arr)
throws
Exception{
String indexDir =
"D:\\01.MYSPACE_2013\\indexs\\dbms"
;
try
{
SearchOpenDBMS.searchLucene(indexDir,
"SEARCH_ALL"
,
"검색 키워드"
,
0
,
1000
,
false
,
false
);
}
catch
(IOException e) {
e.printStackTrace();
}
catch
(ParseException e) {
e.printStackTrace();
}
}
}