2012-10-12 5 views
6

Uwagi do wydania dla Lucene-Core 4,0 wzmianki jako godne uwagi zmiany:W jaki sposób jest włączany nowy opcjonalny BlockPostingsFormat dla Lucene 4.0?

• nowy „blok” PostingsFormat oferujących poprawy wyników wyszukiwania i kompresji indeksu. Prawdopodobnie stanie się to domyślnym formatem w przyszłej wersji.

Za to blog post, BlockPostingsFormat daje mniejsze indeksy i jest szybszy (dla większości zapytań) niż poprzedni format.

Ale nie mogę znaleźć żadnej wzmianki o tym, jak wybrać ten format w wersji 4.0. Gdzie można określić nowy BlockPostingsFormat zamiast starego domyślnego?

Odpowiedz

4

Kilka kroków:

  1. wybrać kodek. Następnie "zmodyfikuj" go, aby użyć BlockPostingsFormat jako klasy PostingFormat. Możesz rozszerzyć klasę kodeków lub użyć opcji FilterCodec, która pozwala zastąpić niektóre ustawienia kodeka.
  2. Utwórz plik w witrynie META-INF/services/org.apache.lucene.codecs.Codec. Powinna ona zawierać pełną nazwę klasy kodeków utworzonej w poprzednim kroku. Ma to na celu zaspokojenie sposobu, w jaki Lucene 4 ładuje kodeki.
  3. Zadzwoń pod IndexWriterConfig.setCodec(Codec), aby określić kodek, który właśnie utworzyłeś.
  4. Użyj obiektu IndexWriterConfig w zwykły sposób.

Zgodnie z Javadoc, BlockPostingsFormat tworzy pliki .doc i .pos w indeksie directoy, a Lucene40PostingsFormat tworzy pliki .frq i .prx. Jest to jeden ze sposobów sprawdzania, czy Lucene rzeczywiście używa formatu blokowania postów.

Zmodyfikowałem przykład w Javadoc z Lucene, aby przetestować format blokowania postów. Oto kod (i nadzieję, że to pomaga):


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

} 
Powiązane problemy