2011-10-01 8 views
5

Creé un filtro de token personalizado que concatena todos los tokens en la secuencia. Este es mi función incrementToken()Solr (Lucene) indexa solo el primer documento después de agregar un TokenFilter personalizado

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

que añade el nuevo filtro hasta el final del índice y el análisis de la cadena de consulta para un campo y probar el filtro de http://localhost:8983/solr/admin/analysis.jsp parece estar funcionando. El filtro está concatenando los tokens en la secuencia. Pero al volver a indexar los documentos solo mi primer documento se indexa.

Así es como se ve mi cadena de filtros.

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

Sin los ConcatFilterFactory todas las palabras están siendo indexados correctamente pero con ConcatFilterFactory sólo el primer documento está siendo indexado. ¿Qué estoy haciendo mal? Amablemente ayúdame a entender el problema.

ACTUALIZACIÓN:

finalmente descubrió el problema.

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

Parece que se está reutilizando la misma clase. Tiene sentido.

+0

Debe publicar su propia respuesta y marcarla como aceptada. Esta pregunta aún aparece como una de las preguntas sin respuesta para Lucene. –

+0

Trabajé en estos años y ahora no recuerdo exactamente qué hice para la solución. :( – Jithin

Respuesta

0

Debe escribir una prueba de unidad para su filtro. Debería fallar incluso si tu Análisis funciona. Aparentemente, olvidó agregar esta línea antes de devolver el mensaje falso:

finished = false; 
Cuestiones relacionadas