Solr 高亮源碼閱讀

Solr高亮使用了不少Lucene的源碼,在Lucene源碼org.apache.lucene.search.highlight包的Highlighter.java裏的方法:java

public final TextFragment[] getBestTextFragments(apache

    TokenStream tokenStream,函數

    String text,post

    boolean mergeContiguousFragments,spa

    int maxNumFragments)調試

會對text文本(document中一個field的文本),逐個token,逐個token 的判斷是否應該高亮。而其中關鍵語句code

startOffset = tokenGroup.matchStartOffset;orm

endOffset = tokenGroup.matchEndOffset;token

tokenText = text.substring(startOffset, endOffset);get

String markedUpText=formatter.highlightTerm(encoder.encodeText(tokenText), tokenGroup);

formatter.highlightTerm這個函數會對解析的tokenText,判斷其是否應該高亮,返回給markedUpText。判斷的依據就是tokenGroup裏保存的一個score,只有當這個score大於0時,才返回高亮文本,而返回的高亮文本會經過預設的pre tag和post tag包起來,也就是默認的<em>和</em>標籤。


08/27/2015

今天調試代碼,發現的奇怪問題是對於某些中文詞,tokenGroup裏保存的startOffset和endOffset值竟然是同樣的,但詞的長度卻記錄下了。形成高亮的代碼忽略了這些詞,真是很是奇怪。好比對於文本「早在上世紀40年代第一臺計算機誕生」,我逐個跟蹤token解析過程,發現它徹底跳過了「第一臺計算機」這幾句。我的懷疑是我使用的中文分詞包有問題。

相關文章
相關標籤/搜索