2.3. インデックスの更新
前節でインデックスの作成を行いましたが、文書が更新される可能性のある場合、 インデックスも最新の状態に保つために更新作業を行う必要があります。
もしインデックスを使用するアプリケーションが一つだけである場合は、インデックスファイルを削除し 新たに作り直すことで最新の状態に保つことが出来ます。
しかしほとんどの場合、検索アプリケーションが起動した状態でインデックスの更新を行う必要があります。 更新された日時を取得するjava.io.FileのlastModified()メソッドを使用した例を示します。
File f = new File(filepath); doc.add(Field.Keyword("modified", Long.toString(f.lastModified()));
まずインデックスに更新日時を保存しておきます。java.io.File.lastModified()
メソッドを用いて更新日時を保存します。
ファイルの更新日時を保存していれば、実際のファイルの更新日時と比較することでファイルが更新されているか否かがわかります。
public void checkDocs(String index){ IndexReader reader = IndexReader.open(index); for(int i=0; i<reader.maxDoc(); i++){ Document doc = reader.document(i); File f = new File(doc.get("filepath")); if(Long.parseLong(doc.get("modified")) < f.lastModified()){ System.out.println("ファイルが更新されています"); reader.delete(i); } if(f.exist() == false ){ System.out.println("ファイルが削除されています"); reader.delete(i); } } reader.close(); }
インデックスに保存されている更新日時よりもファイルの更新日時の方が新しい場合、 IndexReaderのdelete(int)メソッドを呼ぶことでDocumentを削除できます。 削除と言ってもDocumentは一時的に見えなくなるだけで、実際には削除はされません。
IndexWriterのoptimize()メソッドを呼んだ際に、全ての不必要な情報が取り除かれます。 optimize()メソッドを呼ぶ前であれば、IndexReaderのundeleteAll()メソッドを呼ぶことで、元の状態に戻すことが出来ます。 またIndexWriterの生成は、IndexReaderのclose()メソッドを呼んだのちに行う必要があります。