2016-06-07 36 views
0

對於Lucene,我只想對tokenStream的tokenFillter的最後一個標記做一些處理。例如,給出句子「你好,我的世界」,只適用於我的處理「世界」,而不是其他的令牌。Lucene TokenFilter:如何識別來自TokenStream的最後一個令牌?

我可以通過先迭代tokenStream的整個輸入來獲得最後一個標記的偏移量,然後從第一個標記重新開始。因爲我已經知道最後一個標記的偏移量,所以我可以識別當前標記是否是最後一個標記。

但是,由於循環兩次肯定是效率低下,我想只用迭代tokenStream一次,但似乎很難找到正確的方式。

例如,假設MyFilter看起來像:(當然,這個MyFilter是TokenFilter的基本結構)。

public class MyFilter extends TokenFilter{ 

    public MyFilter(TokenStream input){ 
     super(input); 
    } 

    @Override 
    public boolean incrementToken() throws IOException { 
     if (input.incrementToken()){ 

      /* 
       if(current token is the last token): 
        Want to apply something only to the last token. 
      */ 

      return true; 
     } 
     return false; 
    } 
} 

如何識別當前令牌是否是最後一個?

回答

0

我很可能已經來到這裏了棍子的錯誤結束,但我認爲一個的想法恰恰是,你很可能能說出它的啓動,但它的更加棘手知道它在哪裏結束......這可能是他們稱之爲Token*Stream*的原因。

TokenFilter可以告訴你什麼時候開始流:你只需要覆蓋reset()

有一種方法TokenFilter.end(),當然,你可以嘗試重寫這一點,但說的Javadoc:

這個方法被消費者稱爲最後一個記號已經 消耗後,TokenStream.incrementToken後()返回false(使用 新的TokenStream API)。

......這可能意味着它的輸出已經被「消費者」使用了。

爲了檢測到最終結果,我認爲您必須重新設計您的Tokenizer。例如,只要看StandardTokenizer,以及其「業務結束」StandardTokenizerImpl,這可能是相當複雜的。毫無疑問,更好的做出自己的簡單Tokeniser:它接受Strings,或其他任何東西,並且繼續的方式是在向令牌過濾器發送令牌之前進行標記。你會知道有多少令牌會被吐出,並且(例如)你可以在任何時候使用這個號碼到你的TokenFilter ......