目次へ

2. インデックスの作成

2.1. インデックスの作成

1章で紹介した簡単なサンプルを元に改良を加えて行きます。
import java.io.FileReader;
import java.io.IOException;

import org.apache.lucene.analysis.ja.JapaneseAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;

public class SampleIndex{

    public static void main(String[] args) throws IOException{
    
        boolean create = true;
        
        //インデックスに登録するファイルのあるディレクトリ
        File directory = new File(args[0]);
        String[] filepath = directory.list();
        
        //インデックスの保存先
        String index = args[1];
        
        //インデクサの生成
        IndexWriter writer = new IndexWriter(index, new JapaneseAnalyzer(), create);
        
        //文書の解析
        for (int i = 0; i < filepath.length; i++) {
            Document doc = new Document();
            //ファイルパスの登録
            doc.add(Field.UnIndexed("url", filepath[i]));
            Reader reader = new FileReader(filepath[i]);
            //文書の中身の登録
            doc.add(Field.Text("contents",reader));
            writer.addDocument(doc);          
        }
        
        //インデクサのクローズ
        writer.optimize();
        writer.close();
        
    }    
}

まずはじめにインデックスを作成するIndexWriterの初期化を行います。 IndexWriterは新規に作成するだけでなく、既存のインデックスに情報を追加することも出来ます。

IndexWriterのコンストラクタの第一引数は、インデックスを保存するフォルダのパスです。 第二引数は、解析を行うプログラムのインスタンスです。 日本語を形態素解析する場合、org.apache.lucene.analysis.ja.JapaneseAnalyzerを指定する必要があります。 第三引数は、インデックスを新規作成するかどうか指定するフラグです。 trueであれば既存のインデックスは削除され、新たに一から作成することになります。

既に他のIndexWriterによって開かれているインデックスはロックされており、書き込むことが出来ません。 そのためインデックスを作成するプログラムは、常に1つしか動作しない作りになっていることが望ましいです。

次に文書の解析を行います。 あるディレクトリに含まれるファイルの一覧は、java.io.Fileのlist()メソッドで取得出来ます。 ここではサブディレクトリを考慮に入れていません。 またテキストファイルのような、解析を必要としないファイルを対象としています。 HTMLファイルのような解析を必要とするファイルを読み込む場合は、自前の解析プログラムを用意しなければなりません。 逆に言えば、解析プログラムを用意さえすれば、どのような文書でも検索対象にすることが出来ます。

インデックスの登録には、DocumentクラスとFieldクラスを用います。 Documentは1つの文書単位を表すクラス、Fieldクラスは文書の属性を表すクラスです。 インデックスへの登録・インデックスからの検索はDocument単位で行われます。 1つのDocumentは複数のFieldを持ち、各Fieldは属性の名前とその値を持ちます。 Fieldの値が検索対象となります。 なお基本的にFieldの値はString型ですが、java.io.Readerインスタンスを指定することも出来ます。

適切にFieldを設定したDocumentを引数に、IndexWriterのaddDocument(Document)メソッドを呼ぶことで インデックスに文書を追加していきます。 全ての文書を追加し終えたら、最後にIndexWriterのoptimize()メソッドを呼び、インデックスの最適化を行います。

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp