/**
* 查询索引 并高亮显示
* @param fields 要查询的字段
* @param keyWords 输入查询关键字
* @param first 起始条数
* @param max 每页显示的最大条数
*/
public static QueryResult SearchIndexHeight(String[] fields, String keyWords,int first, int max){
List<Article> articles = null;
try {
IndexReader indexReader = DirectoryReader.open(LuceneUtils.directory);
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
QueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_46, fields, LuceneUtils.analyzer);
Query query = queryParser.parse(keyWords);
// ========================================================================================== 【创建高亮器】
Query myQuery = query; // 查询条件
String preTag = "<span class='keywords'>"; // 前缀
String postTag = "</span>"; // 后缀
int size = 400; // 摘要大小
Formatter formatter = new SimpleHTMLFormatter(preTag, postTag); // 前缀、后缀
Scorer scorer = new QueryScorer(myQuery);
Highlighter highlighter = new Highlighter(formatter, scorer);
highlighter.setTextFragmenter(new SimpleFragmenter(size)); // 摘要大小(字数)
// ==========================================================================================
TopDocs topDocs = indexSearcher.search(query, first + max);
int totalHits = topDocs.totalHits;// 总的记录数
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
articles = new ArrayList<Article>();
int endIndex = Math.min(first + max, scoreDocs.length); // 计算结束的边界
for (int i = first; i < endIndex; i++) {// 查询分页的数量
float score = scoreDocs[i].score;// 得分
Document document = indexSearcher.doc(scoreDocs[i].doc);
Article article = DocumentUtils.document2Article(document);
// ======================================================================================== 【使用高亮器】
// 一次高亮一个字段,返回高亮后的结果,如果要高亮的字段值中没有出现关键字,就会返回null
String knowledgeTitle = document.get("knowledgeTitle");
String knowledgeContent = document.get("knowledgeContent");
if(knowledgeTitle!=null){
TokenStream tokenStream = LuceneUtils.analyzer.tokenStream(keyWords, new StringReader(knowledgeTitle));
knowledgeTitle = highlighter.getBestFragment(tokenStream, knowledgeTitle);
if (knowledgeTitle != null) {
article.setKnowledgeTitle(knowledgeTitle);
}
}
if(knowledgeContent!=null){
TokenStream tokenStream = LuceneUtils.analyzer.tokenStream(keyWords, new StringReader(knowledgeContent));
knowledgeContent = highlighter.getBestFragment(tokenStream, knowledgeContent);
if (knowledgeContent != null) {
article.setKnowledgeContent(knowledgeContent);
}
}
// ========================================================================================
articles.add(article);
}
return new QueryResult(articles,totalHits);
} catch (IOException e) {
LoggerUtil.loggerError(LuceneIndex.class, "IOException", e);
throw new RuntimeException(e);
} catch (ParseException e) {
LoggerUtil.loggerError(LuceneIndex.class, "ParseException", e);
throw new RuntimeException(e);
} catch (InvalidTokenOffsetsException e) {
LoggerUtil.loggerError(LuceneIndex.class, "InvalidTokenOffsetsException", e);
throw new RuntimeException(e);
}
}
lucene分页及高亮显示
最新推荐文章于 2024-05-09 11:16:11 发布