?? testlucenehighlighter.java
字號:
package com.laozizhu.search.demo;
import net.paoding.analysis.analyzer.PaodingAnalyzer;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocCollector;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.SimpleFragmenter;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
/**
* Lucene 2.4 + Highlighter 2.4 的分頁+高亮顯示代碼.<br>
* 高亮的css自己寫吧。
*
* @author 老紫竹研究室(laozizhu.com)
*/
public class TestLuceneHighlighter {
private static final String FIELD_TITLE = "title";
private static final String FIELD_BODY = "body";
public synchronized Analyzer getAnalyzer() {
return new PaodingAnalyzer();
}
public void test(String queryString, int begin, int number) {
IndexSearcher isearcher = null;
try {
isearcher = new IndexSearcher("d:/index");
/* 下面這個表示要同時搜索這兩個域,而且只要一個域里面有滿足我們搜索的內(nèi)容就行 */
BooleanClause.Occur[] clauses = { BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD };
TopDocCollector collector = new TopDocCollector(10);
Query query = MultiFieldQueryParser.parse(queryString, new String[] { FIELD_TITLE, FIELD_BODY }, clauses, getAnalyzer());
isearcher.search(query, collector);
ScoreDoc[] hits = collector.topDocs().scoreDocs;
// 用這個進(jìn)行高亮顯示,默認(rèn)是<b>..</b>
// 用這個指定<read>..</read>
SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("<read>", "</read>");
// 構(gòu)造高亮
// 指定高亮的格式
// 指定查詢評分
Highlighter highlighter = new Highlighter(simpleHTMLFormatter, new QueryScorer(query));
// 這個一般等于你要返回的,高亮的數(shù)據(jù)長度
// 如果太小,則只有數(shù)據(jù)的開始部分被解析并高亮,且返回的數(shù)據(jù)也少
// 太大,有時太浪費(fèi)了。
highlighter.setTextFragmenter(new SimpleFragmenter(Integer.MAX_VALUE));
for (int i = begin; i < hits.length && i < begin + number; i++) {
Document doc = isearcher.doc(hits[i].doc);
// 有三個參數(shù)
// 分析器
// 要解析的字段名
// 要解析的數(shù)據(jù)
System.out.println(highlighter.getBestFragment(getAnalyzer(), FIELD_TITLE, doc.get(FIELD_TITLE)));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (isearcher != null) {
try {
isearcher.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -