2011-06-09 18 views
6

Tengo un problema acerca de las compensaciones termvector Lucene que es cuando analicé un campo con mi analizador de encargo que dará a las compensaciones no válidos para termvector pero está bien con el analizador estándar, aquí es mi código analizador dejava lucene analizador personalizado y tokenizer creando un problema en las compensaciones de termvector?

public class AttachmentNameAnalyzer extends Analyzer { 
    private boolean stemmTokens; 
    private String name; 

    public AttachmentNameAnalyzer(boolean stemmTokens, String name) { 
     super(); 
     this.stemmTokens = stemmTokens; 
     this.name   = name; 
    } 

    @Override 
    public TokenStream tokenStream(String fieldName, Reader reader) { 
     TokenStream stream = new AttachmentNameTokenizer(reader); 
     if (stemmTokens) 
      stream = new SnowballFilter(stream, name); 
     return stream; 
    } 

    @Override 
    public TokenStream reusableTokenStream(String fieldName, Reader reader) throws IOException { 
     TokenStream stream = (TokenStream) getPreviousTokenStream(); 

     if (stream == null) { 
      stream = new AttachmentNameTokenizer(reader); 
      if (stemmTokens) 
       stream = new SnowballFilter(stream, name); 
      setPreviousTokenStream(stream); 
     } else if (stream instanceof Tokenizer) { 
      ((Tokenizer) stream).reset(reader); 
     } 

     return stream; 
    } 
} 

¿Qué pasa con esta "Ayuda requerida"

+0

Dado que este código no hace nada relacionado con los desfases de términos, debe publicar uno que sí lo haga. P.ej. su AttachmentNameTokenizer? – Earwin

+0

ok el código del tokenizer está aquí – Badr

+0

Parece totalmente inocente hasta el momento. Más código, ejemplos exactos de entrada + salida (con compensaciones rotas) requeridos :) Sin embargo, iría a la lista de correo de usuarios de lucene. – Earwin

Respuesta

0

el problema con el analizador como he publicado el código para el analizador antes, en realidad, la secuencia de tokens debe estar en reposo por cada nueva entrada de texto que se va a tokenizar.

public TokenStream reusableTokenStream(String fieldName, Reader reader) throws IOException { 
     TokenStream stream = (TokenStream) getPreviousTokenStream(); 

     if (stream == null) { 
      stream = new AttachmentNameTokenizer(reader); 
      if (stemmTokens) 
       stream = new SnowballFilter(stream, name); 
      setPreviousTokenStream(stream); // ---------------> problem was here 
     } else if (stream instanceof Tokenizer) { 
      ((Tokenizer) stream).reset(reader); 
     } 

     return stream; 
    } 

cada vez que I establece el testigo anterior arroyo el campo de texto que viene después del tiene que ser tokens separado siempre comienza con el desplazamiento de la última cadena de componentes léxicos que hacen que el vector término de desplazamiento incorrecto para nueva corriente que ahora es final funciona bien así

ublic TokenStream reusableTokenStream(String fieldName, Reader reader) throws IOException { 
      TokenStream stream = (TokenStream) getPreviousTokenStream(); 

      if (stream == null) { 
       stream = new AttachmentNameTokenizer(reader); 
       if (stemmTokens) 
        stream = new SnowballFilter(stream, name); 
      } else if (stream instanceof Tokenizer) { 
       ((Tokenizer) stream).reset(reader); 
      } 

      return stream; 
     } 
0

¿Qué versión de Lucene estás usando? Estoy mirando super class code para 3x rama y cambios de comportamiento con cada versión.

Es posible que desee comprobar el código de public final boolean incrementToken() donde se calcula offset.

también veo esto:

/** 
* <p> 
* As of Lucene 3.1 the char based API ({@link #isTokenChar(char)} and 
* {@link #normalize(char)}) has been depreciated in favor of a Unicode 4.0 
* compatible int based API to support codepoints instead of UTF-16 code 
* units. Subclasses of {@link CharTokenizer} must not override the char based 
* methods if a {@link Version} >= 3.1 is passed to the constructor. 
* <p> 
* <p> 
* NOTE: This method will be marked <i>abstract</i> in Lucene 4.0. 
* </p> 
*/ 

por cierto, puede volver a escribir la sentencia switch como

@Override 
protected boolean isTokenChar(int c) { 
    switch(c) 
    { 
     case ',': case '.': 
     case '-': case '_': 
     case ' ': 
      return false; 
     default: 
      return true; 
    } 
} 
+0

estoy usando la versión 3.0 – Badr

Cuestiones relacionadas