varios pasos:
- 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.
- 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.
- Llame al IndexWriterConfig.setCodec(Codec) para especificar el códec que acaba de crear.
- 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();
}
}