/** * * @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); } } }