lucene針對高亮顯示功能提供了兩種實現方式,分別是highlighter和fastvectorhighlighter。
顧名思義,fastvectorhighlighter較highlighter速度更快,功能也更強大,但是有使用前提:建立索引時,需要儲存field的分詞向量資訊。(termvector.with_positions_offsets),而highlighter則不需要,如何在時間和空間上進行取捨,需要開發人員自己衡量
lucene處理高亮顯示的大概流程如下:
1.首先獲取原始文件的tokenstream
原始文件可打到索引裡(通過store.yes屬性),也可從其他物理媒介中獲取(考慮到lucene的儲存效能不是很高效)
高亮顯示功能需要知道每乙個term的位置和偏移量資訊,在索引庫中這些資訊是通過分詞向量(termvector)來儲存的,因此在建立索引階段,如果為索引域指定termvector.with_positions_offsets屬性,則可以加快tokenstream的獲取過程,否則需要通過analyzer去重新解析獲取
lucene提供了tokensources這個實用類,通過它提供的靜態方法,可以很方便的獲取到文件的tokenstream資訊:
tokensources.getanytokenstream(reader, docid, field, analyzer);//方法體中會先通過termvector獲取tokenstream,termvector不存在,通過analyzer獲取
該方法的使用前提是建立索引時指定了store.yes資訊,如不指定該資訊,可通過analyzer.tokenstream(field, new stringreader(string text))方法來獲取text的tokenstream。
2.將原始文件進行切片處理
當原始文件資訊量較大時,我們可能只需要高亮出區域性有價值的資訊,而將其他的冗餘資訊過濾掉,這個時候就需要對原始資訊進行切片處理,選出最有價值的切片來進行加工。
nullfragmenter:不進行切片處理,保留原始文件的所有字元
******fragmenter:按指定字元長度將文件進行分割(預設字元長度是100)
******spanfragmenter:功能同******fragmenter類似,但不會將spanquery或phrasequery的查詢結果打散。
3.選出最符合搜尋條件的文件切片
lucene提供了queryscorer和spanscorer類來對每乙個切片進行評分
在lucene實戰一書中,作者建議我們使用******spanfragmenter+spanscorer的組合方式,但在3.6版本的測試中spanscorer視乎不再適用(個人沒搞清楚怎樣使用)
4.將最後選定的文件片段進行編碼處理
5.格式化顯示編碼之後的文件片段資訊(加粗、改變字型顏色等等。。。)
highlighter使用示例:
//首先獲取docid的tokenstream
tokenstream tokenstream=tokensources.getanytokenstream(reader, docid, field, analyzer);
//構建fragmenter物件,用於文件切片
fragmenter fragmenter = new ******fragmenter(100);//預設字元為100
//構建scorer,用於選取最佳切片
scorer fragmentscore = new queryscorer(query);
//構建formatter格式化最終顯示(將字型顏色設定為紅色)
formatter formatter = new ******htmlformatter("","");
//例項化highlighter元件
highlighter highlighter = new highlighter(formatter,fragmentscore);
highlighter.settextfragmenter(fragmenter);
// 最後一步,獲取hightlighttext
highlighter.getbestfragment(tokenstream, text);//第二個引數為原始文件資訊
fastvectorhighlighter使用示例:
//構造highlighter元件
fraglistbuilder fraglistbuilder = new ******fraglistbuilder();
fragmentsbuilder fragmentbuilder =new scoreorderfragmentsbuilder(
basefragmentsbuilder.colored_pre_tags,
basefragmentsbuilder.colored_post_tags);
fastvectorhighlighter highligher=new fastvectorhighlighter(true, true,fraglistbuilder, fragmentbuilder);
//構造fieldquery
query query=new queryparser(...).parse(...);
fieldquery fieldquery = highlighter.getfieldquery(query);
//高亮最佳文件切片
highlighter.getbestfragment(fieldquery, indexreader reader, int docid, string field, int fragcharsize);//fragcharsize需要大於18
注意:使用fastvectorhighlighter,在建立索引時,必須要為field指定termvector.with_positions_offsets和store.yes屬性 lucene高亮顯示
lucene針對高亮顯示功能提供了兩種實現方式,分別是highlighter和fastvectorhighlighter 顧名思義,fastvectorhighlighter較highlighter速度更快,功能也更強大,但是有使用前提 建立索引時,需要儲存field的分詞向量資訊 termvect...
Lucene 4 7 教程起步 高亮顯示
歡迎光臨我的個人 csdn更多以工具文章為主,個人 裡會有更多關於程式設計思維等多方面的文章 我開發本段 用到的jar包 後面三個為相比之前文章中新引入的 setfields new hashset fields.add carid fields.add carname org.apache.luc...
lucene 多欄位查詢 文字高亮顯示
先建立索引,lucene3.0 directory directory null indexsearcher isearcher null analyzer analyzer new ikanalyzer directory new fsdirectory new file d data isear...