2012-10-12 104 views
6

Las notas de la versión para Lucene-Core 4.0 mención como un cambio notable:¿Cómo está habilitado el nuevo BlockPostingsFormat opcional para Lucene 4.0?

• Una nueva mejora de rendimiento de la búsqueda "bloque" oferta PostingsFormat y compresión de índice. Es probable que este se convierta en el formato predeterminado en una versión futura.

Por este blog post, el BlockPostingsFormat da como resultado índices más pequeños y es más rápido (para la mayoría de las consultas) que el formato anterior.

Pero, no puedo encontrar ninguna mención de cómo optar por este formato en 4.0. ¿Dónde se puede especificar el nuevo BlockPostingsFormat con preferencia al antiguo predeterminado?

Respuesta

4

varios pasos:

  1. elegir un códec. Luego, "modificarlo" para usar BlockPostingsFormat como clase PostingFormat. Puede ampliar la clase del códec o usar FilterCodec, lo que le permite anular algunas de las configuraciones de un códec.
  2. Cree un archivo en META-INF/services/org.apache.lucene.codecs.Codec. Debería enumerar el nombre de clase completo de la clase de códec que creó en el paso anterior. Esto es para satisfacer la forma en que Lucene 4 carga los códecs.
  3. Llame al IndexWriterConfig.setCodec(Codec) para especificar el códec que acaba de crear.
  4. Utilice el objeto IndexWriterConfig como de costumbre.

Según el Javadoc, BlockPostingsFormat crea archivos .doc y .pos en el directorio índice, mientras que Lucene40PostingsFormat crea archivos .frq y .prx. Esa es una forma de saber si Lucene realmente está usando el formato de publicación de bloque.

Modifiqué el ejemplo en el Javadoc core de Lucene para probar el formato de publicación de bloque. Aquí está el código (y espero que ayude):


org.apache.lucene.codecs.Codec

# See http://www.romseysoftware.co.uk/2012/07/04/writing-a-new-lucene-codec/ 
# This file should be in /somewhere_in_your_classpath/META-INF/services/org.apache.lucene.codecs.Codec 
# 
# List of codecs 
lucene4examples.Lucene40WithBlockCodec 

Lucene40WithBlockCodec.java

package lucene4examples; 

import org.apache.lucene.codecs.FilterCodec; 
import org.apache.lucene.codecs.PostingsFormat; 
import org.apache.lucene.codecs.block.BlockPostingsFormat; 
import org.apache.lucene.codecs.lucene40.Lucene40Codec; 

// Lucene 4.0 codec with block posting format 

public class Lucene40WithBlockCodec extends FilterCodec { 

    public Lucene40WithBlockCodec() { 
    super("Lucene40WithBlock", new Lucene40Codec()); 

    } 

    @Override 
    public PostingsFormat postingsFormat() { 
    return new BlockPostingsFormat(); 
    } 

} 

BlockPostingsFormatExample.java

package lucene4examples; 

import java.io.File; 
import java.io.IOException; 

import org.apache.lucene.analysis.Analyzer; 
import org.apache.lucene.analysis.standard.StandardAnalyzer; 
import org.apache.lucene.document.Document; 
import org.apache.lucene.document.Field; 
import org.apache.lucene.document.TextField; 
import org.apache.lucene.index.DirectoryReader; 
import org.apache.lucene.index.IndexWriter; 
import org.apache.lucene.index.IndexWriterConfig; 
import org.apache.lucene.queryparser.classic.ParseException; 
import org.apache.lucene.queryparser.classic.QueryParser; 
import org.apache.lucene.search.IndexSearcher; 
import org.apache.lucene.search.Query; 
import org.apache.lucene.search.ScoreDoc; 
import org.apache.lucene.store.Directory; 
import org.apache.lucene.store.FSDirectory; 
import org.apache.lucene.util.Version; 

// This example is based on the one that comes with Lucene 4.0.0 core API Javadoc 
// (http://lucene.apache.org/core/4_0_0/core/overview-summary.html) 

public class BlockPostingsFormatExample { 

    public static void main(String[] args) throws IOException, ParseException { 
    Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_40); 

    // Store the index on disk: 
    Directory directory = FSDirectory.open(new File(
     "/index_dir")); 
    IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_40, 
     analyzer); 

    // If the following line of code is commented out, the original Lucene 
    // 4.0 codec will be used. 
    // Else, the Lucene 4.0 codec with block posting format 
    // (http://blog.mikemccandless.com/2012/08/lucenes-new-blockpostingsformat-thanks.html) 
    // will be used. 
    config.setCodec(new Lucene40WithBlockCodec()); 

    IndexWriter iwriter = new IndexWriter(directory, config); 
    Document doc = new Document(); 
    String text = "This is the text to be indexed."; 
    doc.add(new Field("fieldname", text, TextField.TYPE_STORED)); 
    iwriter.addDocument(doc); 
    iwriter.close(); 

    // Now search the index: 
    DirectoryReader ireader = DirectoryReader.open(directory); 
    IndexSearcher isearcher = new IndexSearcher(ireader); 
    // Parse a simple query that searches for "text": 
    QueryParser parser = new QueryParser(Version.LUCENE_40, "fieldname", 
     analyzer); 
    Query query = parser.parse("text"); 
    ScoreDoc[] hits = isearcher.search(query, null, 1000).scoreDocs; 
    System.out.println("hits.length = " + hits.length); 
    // Iterate through the results: 
    for (int i = 0; i < hits.length; i++) { 
     Document hitDoc = isearcher.doc(hits[i].doc); 
     System.out.println("text: " + hitDoc.get("fieldname")); 
    } 
    ireader.close(); 
    directory.close(); 
    } 

} 
Cuestiones relacionadas