/**
*
* @author Q.Wong [2010-12-17]
*
*/
public class QueryManager {
private static Logger logger = LogManager.getLogger(QueryManager.class);
/**
* 执行查询
*
* @param analyzer
* @param searcher
* @param field
* @param keyWord
* @param n
* @return
* @throws ParseException
* @throws IOException
*/
public static TopDocs doQuery(Analyzer analyzer, Searcher searcher,
String field, String keyWord, int n) throws ParseException,
IOException {
QueryParser parser = new QueryParser(Version.LUCENE_30, field, analyzer);
Query query = parser.parse(keyWord);
TopDocs hits = searcher.search(query, n);
return hits;
}
/**
* 处理查询返回的结果
*
* @param hits
* @param searcher
* @throws CorruptIndexException
* @throws IOException
*/
public static void resolvedResults(TopDocs hits, Searcher searcher)
throws CorruptIndexException, IOException {
ScoreDoc[] scoreDocs = hits.scoreDocs;
for (ScoreDoc scoreDoc : scoreDocs) {
Document doc = searcher.doc(scoreDoc.doc);
logger.info(doc.getField("path") + " " + scoreDoc.toString()
+ " ");
}
}
/**
* 执行查询并处理查询结果
* 高亮关键字
*
* @param analyzer
* @param reader
* @param fieldName
* @param keyWord
* @param n
* @throws ParseException
* @throws IOException
* @throws InvalidTokenOffsetsException
*/
public static void doQuery(Analyzer analyzer, IndexReader reader,
String fieldName, String keyWord, int n) throws ParseException,
IOException, InvalidTokenOffsetsException {
QueryParser parser = new QueryParser(Version.LUCENE_30, fieldName,
analyzer);
Query query = parser.parse(keyWord);
Searcher searcher = new IndexSearcher(reader);
TopDocs hits = searcher.search(query, n);
Highlighter highlighter = new Highlighter(new Formatter() {
@Override
public String highlightTerm(String originalText, TokenGroup group) {
if (group.getTotalScore() <= 0) {
return originalText;
}
return "【" + originalText + "】";
}
}, new QueryScorer(query));
int maxNumFragmentsRequired = 5;
String fragmentSeparator = "...";
ScoreDoc[] scoreDocs = hits.scoreDocs;
for (ScoreDoc scoreDoc : scoreDocs) {
int docId = scoreDoc.doc;
Document doc = searcher.doc(docId);
String text = doc.get(fieldName);
TermPositionVector tpv = (TermPositionVector) reader
.getTermFreqVector(docId, fieldName);
System.out.println(tpv.size());
TokenStream tokenStream = TokenSources.getTokenStream(tpv);
String result = highlighter.getBestFragments(tokenStream, text,
maxNumFragmentsRequired, fragmentSeparator);
System.out.println(result);
}
}
}