2012-08-14 13 views
9

En el método de indexación utilizo la línea siguiente:Cómo utilizar TermVector Lucene 4.0

Field contentsField = new Field("contents", new FileReader(f), Field.TermVector.YES); 

Sin embargo, en Lucene 4.0 este constructor es obsoleto y new TextField se debe utilizar en lugar de new Field.

Pero el problema con TextField es que no acepta TermVector en sus constructores.

¿Hay alguna manera de incluir el término Vector en mi indexación en Lucene 4.0 con los nuevos constructores?

Gracias

Respuesta

11

campo de texto es una clase de conveniencia para los usuarios que necesitan campos indexados sin vectores plazo. Si necesita vectores de términos, solo use un Field. Se necesitan unas cuantas líneas más de código ya que primero debe crear una instancia de FieldType, establecer storeTermVectors y tokenizer en true y luego usar esta instancia FieldType en el constructor Field.

12

que tenían el mismo problema, así que simplemente creado mi propio campo:

public class VecTextField extends Field { 

/* Indexed, tokenized, not stored. */ 
public static final FieldType TYPE_NOT_STORED = new FieldType(); 

/* Indexed, tokenized, stored. */ 
public static final FieldType TYPE_STORED = new FieldType(); 

static { 
    TYPE_NOT_STORED.setIndexed(true); 
    TYPE_NOT_STORED.setTokenized(true); 
    TYPE_NOT_STORED.setStoreTermVectors(true); 
    TYPE_NOT_STORED.setStoreTermVectorPositions(true); 
    TYPE_NOT_STORED.freeze(); 

    TYPE_STORED.setIndexed(true); 
    TYPE_STORED.setTokenized(true); 
    TYPE_STORED.setStored(true); 
    TYPE_STORED.setStoreTermVectors(true); 
    TYPE_STORED.setStoreTermVectorPositions(true); 
    TYPE_STORED.freeze(); 
} 

// TODO: add sugar for term vectors...? 

/** Creates a new TextField with Reader value. */ 
public VecTextField(String name, Reader reader, Store store) { 
    super(name, reader, store == Store.YES ? TYPE_STORED : TYPE_NOT_STORED); 
} 

/** Creates a new TextField with String value. */ 
public VecTextField(String name, String value, Store store) { 
    super(name, value, store == Store.YES ? TYPE_STORED : TYPE_NOT_STORED); 
} 

/** Creates a new un-stored TextField with TokenStream value. */ 
public VecTextField(String name, TokenStream stream) { 
    super(name, stream, TYPE_NOT_STORED); 
} 

}

espero que esto ayude