Lucene5 實現搜索引擎功能,高亮代碼
package search.searchengine.cs.swjtu;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
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.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopScoreDocCollector;
import org.apache.lucene.search.highlight.Formatter;
import org.apache.lucene.search.highlight.Fragmenter;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.InvalidTokenOffsetsException;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.SimpleFragmenter;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
import org.apache.lucene.search.highlight.SimpleSpanFragmenter;
import org.apache.lucene.search.highlight.TokenSources;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
public class Query {
/*
*
* 索引後,進行查詢,將查詢結果封裝爲QueryBean對象,加入session,爲JSP提供頁面結果
*
* */
private static String lighterStr(org.apache.lucene.search.Query query,Analyzer a,String fieldName,String txt) throws IOException, InvalidTokenOffsetsException {
String str = null;//設定放回結果
QueryScorer queryScorer = new QueryScorer(query);//若是有須要,能夠傳入評分
//設置高亮標籤
Formatter formatter = new SimpleHTMLFormatter("<span style='color:red;'>", "</span>");
//高亮分析器
Highlighter hl = new Highlighter(formatter, queryScorer);
Fragmenter fragmenter = new SimpleSpanFragmenter(queryScorer);
hl.setTextFragmenter(fragmenter);
//獲取返回結果
str = hl.getBestFragment(a, fieldName,txt);
if(str == null){
return txt;
}
return str;
}
public static List query(String queryString,String indexUrl) throws IOException, ParseException, InvalidTokenOffsetsException {
/**/ /* 這裏放索引文件的位置 */
Path path = Paths.get(indexUrl);
Directory indexDir = FSDirectory.open(path);
org.apache.lucene.search.Query query = null;
IndexReader reader = DirectoryReader.open(indexDir);
IndexSearcher searcher = new IndexSearcher(reader);
TopScoreDocCollector collector = TopScoreDocCollector.create(10);
Analyzer analyzer = new StandardAnalyzer();
QueryScorer queryScorer = new QueryScorer(query);//若是有須要,能夠傳入評分
//設置高亮標籤
Formatter formatter = new SimpleHTMLFormatter("<span style='color:red;'>", "</span>");
//高亮分析器
Highlighter hl = new Highlighter(formatter, queryScorer);
Fragmenter fragmenter = new SimpleSpanFragmenter(queryScorer);
hl.setTextFragmenter(fragmenter);
try {
QueryParser qp = new QueryParser( "content", analyzer);
query = qp.parse(queryString);
} catch (ParseException e) {
}
searcher.search(query, collector);
ScoreDoc[] hits = collector.topDocs().scoreDocs;
List<String> rstList = new ArrayList<String>();//結果列表(已高亮處理)
System.out.println("Found " + hits.length + " hits.");
for(int i=0;i<hits.length;i++) {
int docId = hits[i].doc;
Document d = searcher.doc(docId);
String rst = "";
String title = d.get("title");
String content = d.get("content");
title = lighterStr(query, analyzer, "title", title);
content = lighterStr(query, analyzer, "content", content);
rst = d.get("url")+"\t"+title+"\t"+content;
rstList.add(rst);
//System.out.println((i + 1) +". " + d.get("url") +" "+title+"\t"+content);
System.out.println((i + 1) +". " + rst);
}
return rstList;
}
}