在上一篇文章搜索學習入門--Lucene初體驗(Lucene索引的增刪改查)的基礎上,我們進行對Lucene檢索結果的高亮顯示。
第一步:在增加Lucene高亮模塊依賴
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-highlighter</artifactId>
<version>4.7.2</version>
</dependency>
第二步:高亮顯示Lucene檢索結果的關鍵詞
package top.yuyufeng.learn.lucene.demo1;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
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.highlight.*;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.SimpleFSDirectory;
import org.apache.lucene.util.Version;
import java.io.File;
import java.io.IOException;
/**
* @author yuyufeng
* @date 2017/11/21
*/
public class LuceneHighlighterDemo {
public static void main(String[] args) {
// Lucene Document的域名
String fieldName = "blog";
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_47);
Directory directory = null;
IndexReader ireader = null;
IndexSearcher isearcher;
try {
//索引目錄
directory = new SimpleFSDirectory(new File("D://test/lucene_index"));
// 配置IndexWriterConfig
IndexWriterConfig iwConfig = new IndexWriterConfig(Version.LUCENE_47, analyzer);
iwConfig.setOpenMode(IndexWriterConfig.OpenMode.CREATE_OR_APPEND);
// 搜索過程**********************************
// 實例化搜索器
ireader = DirectoryReader.open(directory);
isearcher = new IndexSearcher(ireader);
String keyword = "達摩院";
// 使用QueryParser查詢分析器構造Query對象
QueryParser qp = new QueryParser(Version.LUCENE_47, fieldName, analyzer);
qp.setDefaultOperator(QueryParser.OR_OPERATOR); // and or 跟數據庫查詢語法類似
Query query = qp.parse(keyword);
System.out.println("Query = " + query);
// 搜索相似度最高的5條記錄
TopDocs topDocs = isearcher.search(query, 5);
System.out.println("命中:" + topDocs.totalHits);
// 遍歷輸出結果
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
Highlighter highlighter = new Highlighter(new SimpleHTMLFormatter("<B>", "</B>"), //高亮格式,用<B>標簽包裹
new QueryScorer(query));
Fragmenter fragmenter = new SimpleFragmenter(100); //高亮后的段落范圍在100字內
highlighter.setTextFragmenter(fragmenter);
for (int i = 0; i < topDocs.totalHits; i++) {
Document targetDoc = isearcher.doc(scoreDocs[i].doc);
System.out.println("內容:" + highlighter.getBestFragment(analyzer, fieldName, targetDoc.get("blog"))); //只對“blog”屬性高亮
}
} catch (ParseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InvalidTokenOffsetsException e) {
e.printStackTrace();
} finally {
if (ireader != null) {
try {
ireader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (directory != null) {
try {
directory.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
第三步:執行查看結果
Query = blog:達 blog:摩 blog:院
命中:2
內容:10月11日杭州云棲大會上,馬云表<B>達</B>了對新建成的阿里巴巴全球研究<B>院</B>—阿里巴巴<B>達</B><B>摩</B><B>院</B>的愿景,希望<B>達</B><B>摩</B><B>院</B>二十年內成為世界第一大經濟體,服務世界二十億人,創造一億個工作崗位。
內容:<B>達</B><B>摩</B><B>院</B>一定也必須要超越英特爾,必須超越微軟,必須超越IBM,因為我們生于二十一世紀,我們是有機會后發優勢的。