2011-10-01 6 views
5

ストリーム内のすべてのトークンを連結するカスタムトークンフィルタを作成しました。これは私のincrementToken()機能Solr(Lucene)はカスタムTokenFilterを追加した後の最初のドキュメントのみを索引付けしています

public boolean incrementToken() throws IOException {       
    if (finished) {               
     logger.debug("Finished");           
     return false;              
    }                  
    logger.debug("Starting");            
    StringBuilder buffer = new StringBuilder();        
    int length = 0;               
    while (input.incrementToken()) {           
     if (0 == length) {             
      buffer.append(termAtt);           
      length += termAtt.length();          
     } else {                
      buffer.append(" ").append(termAtt);        
      length += termAtt.length() + 1;         
     }                 
    }                  
    termAtt.setEmpty().append(buffer);          
    //offsetAtt.setOffset(0, length);          
    finished = true;               
    return true;                
} 

である私は、フィールドのインデックスとクエリ分析チェーンの最後に新しいフィルタを追加し、http://localhost:8983/solr/admin/analysis.jspからフィルタをテスト動作しているようです。フィルタはストリーム内のトークンを連結します。しかし、文書を再索引付けすると、最初の文書のみが索引付けされます。

これは私のフィルターチェーンの外観です。

 <analyzer type="index">            
      <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="[-_]" replacement=" " /> 
      <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="[^\p{L}\p{Nd}\p{Mn}\p{Mc}\s+]" replacement="" /> 
      <tokenizer class="solr.WhitespaceTokenizerFactory" />   
      <filter class="solr.LowerCaseFilterFactory" />     
      <filter class="solr.StopWordFilterFactory" ignoreCase="true"    words="words.txt" /> 
      <filter class="org.custom.solr.analysis.ConcatFilterFactory" /> 
     </analyzer>               
     <analyzer type="query">            
      <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="[-_]" replacement=" " /> 
      <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="[^\p{L}\p{Nd}\p{Mn}\p{Mc}\s+]" replacement="" /> 
      <tokenizer class="solr.WhitespaceTokenizerFactory" />   
      <filter class="solr.LowerCaseFilterFactory" />     
      <filter class="solr.StopWordFilterFactory" ignoreCase="true"    words="words.txt" /> 
      <filter class="org.custom.solr.analysis.ConcatFilterFactory" /> 
     </analyzer> 

ConcatFilterFactoryがなければ、すべての単語が適切にインデックス化取得されますが、ConcatFilterFactoryで唯一の最初の文書がインデックス化されるばかり。私は間違って何をしていますか?問題を理解するのを助けてください。

UPDATE:

最後に問題を考え出しました。

if (finished) {               
    logger.debug("Finished"); 
    finished = false;         
    return false;              
} 

同じクラスが再利用されているように見えます。意味をなさない

+0

あなた自身の回答を投稿し、それを受け入れたとマークする必要があります。この質問は、依然としてLuceneの未解決の疑問の1つです。 –

+0

私はここ数年前に仕事をしていましたが、修正のために正確に何をしたのか覚えていません。 :( – Jithin

答えて

0

フィルタの単体テストを書く必要があります。分析が機能しても失敗するはずです。明らかにfalseを返す前にこの行を追加するのを忘れてしまった:

finished = false; 
関連する問題