6

Lucene-Core 4.0のリリースノートには、注目すべき変更点が記載されています。

•検索パフォーマンスとインデックス圧縮を改善する新しい「ブロック」PostingsFormat。これは、将来のリリースでデフォルトの形式になる可能性があります。

このブログ投稿によると、BlockPostingsFormatの結果、インデックスが小さくなり、以前の形式よりも高速になります(ほとんどのクエリで)。

しかし、4.0でこのフォーマットを選択する方法についての言及はどこにも見つかりません。古いデフォルトよりも新しいBlockPostingsFormatをどこに指定できますか?

4

1 に答える 1

4

いくつかのステップ:

  1. コーデックを選択します。次に、 BlockPostingsFormatをPostingFormatクラスとして使用するように「変更」します。コーデックのクラスを拡張するか、FilterCodecを使用して、コーデックの設定の一部を上書きすることができます。
  2. META-INF / services/org.apache.lucene.codecs.Codecにファイルを作成します。前の手順で作成したコーデッククラスの完全なクラス名が表示されます。これは、Lucene4がコーデックをロードする方法を満たすためです。
  3. IndexWriterConfig.setCodec(Codec)を呼び出して、作成したコーデックを指定します。
  4. 通常どおりIndexWriterConfigオブジェクトを使用します。

Javadocによると、BlockPostingsFormatはインデックスディレクトリに.docファイルと.posファイルを作成し、Lucene40PostingsFormatは.frqファイルと.prxファイルを作成します。これは、Luceneが実際にブロック投稿形式を使用しているかどうかを判断する1つの方法です。

LuceneコアJavadocの例を変更して、ブロック投稿形式をテストしました。これがコードです(そしてそれが役立つことを願っています):


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

}
于 2012-10-22T21:41:36.697 に答える