2011-10-01 18 views
5

Akıştaki tüm belirteçleri birleştiren özel bir belirteç filtresi oluşturdum. Bu Solr (Lucene) özel bir TokenFilter ekledikten sonra yalnızca ilk belgeyi dizine ekliyor

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;                
} 

Bir alan için endeks ve sorgu analizi zincirinin sonuna yeni Filtre eklenmiş ve http://localhost:8983/solr/admin/analysis.jsp Filtreyi test çalışıyor görünüyor benim incrementToken() fonksiyonudur. Filtre, akıştaki belirteçleri birleştiriyor. Ancak belgeleri yeniden indekslemede sadece ilk belgem indeksleniyor.

Filtre zincirim nasıl görünür. ConcatFilterFactory tüm kelimeler olmadan

 <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> 

düzgün dizine alıyorsanız ancak ConcatFilterFactory sadece ilk belge endeksli oluyor. Neyi yanlış yapıyorum? Lütfen problemi anlamada bana yardımcı olun.

GÜNCELLEME:

Son olarak konuyu anladım.

Aynı sınıfın yeniden kullanılmakta olduğu anlaşılıyor. Mantıklı.

+0

Kendi yanıtınızı yazmalı ve kabul edildi olarak işaretlemelisiniz. Bu soru hala Lucene için en iyi cevaplanmamış sorulardan biri olarak ortaya çıkıyor. –

+0

Bu yıllarda çalıştım ve şimdi tam da ne için yaptığımı hatırlayamıyorum. :( – Jithin

cevap

0

Filtreniz için bir birim testi yazmalısınız. Analiziniz çalışsa bile başarısız olmalıdır. Görünüşe göre yanlış satırdan önce bu satırı eklemeyi unutmuştunuz:

finished = false;