lucene 高亮显示
原文地址: http://blog.csdn.net/javaman_chen/article/details/8224407?
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:不進行切片處理,保留原始文檔的所有字符
SimpleFragmenter:按指定字符長度將文檔進行分割(默認字符長度是100)
SimpleSpanFragmenter:功能同SimpleFragmenter類似,但不會將SpanQuery或PhraseQuery的查詢結果打散。
3.選出最符合搜索條件的文檔切片
Lucene提供了QueryScorer和SpanScorer類來對每一個切片進行評分
在Lucene實戰一書中,作者建議我們使用SimpleSpanFragmenter+SpanScorer的組合方式,但在3.6版本的測試中SpanScorer視乎不再適用(個人沒搞清楚怎樣使用)
4.將最后選定的文檔片段進行編碼處理
5.格式化顯示編碼之后的文檔片段信息(加粗、改變字體顏色等等。。。)
Highlighter使用示例:
注意:使用FastVectorHighlighter,在創建索引時,必須要為field指定TermVector.WITH_POSITIONS_OFFSETS和Store.YES屬性
轉載于:https://www.cnblogs.com/anyuan9/p/6171543.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的lucene 高亮显示的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高斯消元学习
- 下一篇: php 5.5 xhprof for w