2012-02-23 30 views
0

我一直在嘗試在Lucene中實現自定義分析器。我認爲我非常接近完成,但我面臨兩個奇怪的問題。Lucene的incrementToken()上一項被忽略

首先,除了最後一個,我的過濾器對令牌流中的每個術語都按預期工作。 (雖然我正在努力處理它)。

其次,我不會有使用該TokenFilter的問題(甚至錯過了上一屆)。但是,雖然索引工作正常(使用Luke檢查結果索引),但當我嘗試使用我的分析器解析用戶查詢時=生成的查詢爲空(!)這是否可能是由於缺少的術語?

我已經發布了以下過濾器的incrementToken()方法。任何幫助將非常受歡迎。先謝謝你。

P.S.我現在從貢獻的角度來看,這個問題並不好,但我找不到其他地方的具體內容。

public boolean incrementToken() throws IOException { 
    if (!input.incrementToken()) { 
     if (previousTokenFlag) { 
      tempPreviousToken.attSource.copyTo(this); 
      previousTokenFlag = false; 
      this.incrementToken(); 
      return false; 
     } else { 
      return false; 
     } 
    } 
    if (previousTokenFlag) { 
     if (CheckIfMainName(this.termAtt.term())) { 
      if (CheckIfMainName(tempPreviousToken.termAtt.term())) { 
       termAtt.setTermBuffer(tempPreviousToken.termAtt.term() + 
         TOKEN_SEPARATOR + this.termAtt.term()); 
       this.setPreviousTokenFlag(false); 
       return true; 
      } else { 
       tempHelpingToken = new TempToken(this.input.cloneAttributes()); 
      } 
      tempPreviousToken.attSource.copyTo(this); 
      tempHelpingToken.attSource.copyTo(tempPreviousToken.attSource); 
      return true; 
     } else { 
      if (CheckIfMainName(tempPreviousToken.termAtt.term())) { 
       tempHelpingToken = new TempToken(this.input.cloneAttributes()); 
       tempPreviousToken.attSource.copyTo(this); 
       tempHelpingToken.attSource.copyTo(tempPreviousToken.attSource); 
       tempHelpingToken.attSource.clearAttributes(); 
       return true; 
      } else { 
       tempHelpingToken = new TempToken(this.input.cloneAttributes()); 
       tempPreviousToken.attSource.copyTo(this); 
       tempHelpingToken.attSource.copyTo(tempPreviousToken.attSource); 
       tempHelpingToken.attSource.clearAttributes(); 
       return true; 
      } 
     } 
    } else { 
     tempPreviousToken = new TempToken(this.input.cloneAttributes()); 
     tempPreviousToken.termAtt.setTermBuffer(this.termAtt.term()); 
     this.setPreviousTokenFlag(true); 
     this.incrementToken(); 
     return true; 
    } 
} 
+0

我真的很抱歉,你是對的。另外我想我解決了它,我會在今天晚些時候發佈代碼(清理)。 – Damerian 2012-02-25 09:13:24

回答

0

我不知道你正在嘗試做的,但你的第一線篩選看看錯:

 tempPreviousToken.attSource.copyTo(this); 
     previousTokenFlag = false; 
     this.incrementToken(); 
     return false; 

首先,您複製tempPreviousToken當前的令牌(tempPreviousToken.attSource.copyTo(this)) ,然後你總是回報錯誤,沒有機會使用當前令牌。您應該直接返回false,或者根據您嘗試複製的令牌返回true/false。