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()メソッドを呼び、インデックスの最適化を行います。

