lucene分页及高亮显示

/**
	 * 查询索引 并高亮显示
	 * @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);
		}
	}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值