2011-10-01 8 views
5

Ho creato un filtro token personalizzato che concatena tutti i token nel flusso. Questa è la mia funzione incrementToken()Solr (Lucene) sta indicizzando solo il primo documento dopo aver aggiunto un TokenFilter personalizzato

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

ho aggiunto il nuovo filtro al fine di indice e catena di analisi query per un campo e test del filtro dal http://localhost:8983/solr/admin/analysis.jsp sembra funzionare. Il filtro concatena i token nel flusso. Ma sul reindicizzare i documenti solo il mio primo documento viene indicizzato.

Ecco come appare la mia catena di filtri.

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

Senza le ConcatFilterFactory tutte le parole siano sempre indicizzati correttamente ma con ConcatFilterFactory è ottenere indicizzati solo il primo documento. Che cosa sto facendo di sbagliato? Gentilmente aiutami a capire il problema.

UPDATE:

finalmente capito il problema.

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

Sembra che la stessa classe venga riutilizzata. Ha senso.

+0

Dovresti pubblicare la tua risposta e contrassegnarla come accettata. Questa domanda si presenta ancora come una delle principali domande senza risposta per Lucene. –

+0

Ho lavorato a questi anni fa e ora non riesco a ricordare cosa ho fatto esattamente per la correzione. :( – Jithin

risposta

0

Si dovrebbe scrivere un test unitario per il filtro. Dovrebbe fallire anche se la tua analisi funziona. A quanto pare hai dimenticato di aggiungere questa riga prima di restituire false:

finished = false;