3

約 500 個のファイルを含むフォルダー (MY_FILES) があり、毎日新しいファイルが到着し、そこに配置されます。各ファイルのサイズは約 4Mb です。

これらのファイルで特定のワイルドカードを検索できるかどうかをテストするために、単純な「void main」を開発しました。それはうまく動作します。

問題は、古い indexed_folder を削除して、再度インデックスを作成していることです。これには多くの時間がかかり、明らかに非効率的です。私が探しているのは「増分インデックス」です。つまり、インデックスが既に存在する場合は、新しいファイルをインデックスに追加するだけです。

インデックスを作成する前に、「ドキュメント」にインデックスが作成されているかどうかを確認するメカニズムが Lucene にあるかどうか疑問に思っていました。writer.isDocExists のようなものですか?

ありがとう!

私のコードは次のようになります。

       // build the writer
       IndexWriter writer;
       IndexWriterConfig indexWriter = new IndexWriterConfig(Version.LUCENE_36, analyzer);
       writer = new IndexWriter(fsDir, indexWriter);
       writer.deleteAll();  //must - otherwise it will return duplicated result 
       //build the docs and add to writer
       File dir = new File(MY_FILES);
       File[] files = dir.listFiles();
       int counter = 0;
       for (File file : files) 
       { 
           String path = file.getCanonicalPath();
           FileReader reader = new FileReader(file);
           Document doc = new Document();  
           doc.add(new Field("filename", file.getName(), Field.Store.YES, Field.Index.ANALYZED));
           doc.add(new Field("path", path, Field.Store.YES, Field.Index.ANALYZED));
           doc.add(new Field("content", reader));  

           writer.addDocument(doc);
           System.out.println("indexing "+file.getName()+" "+ ++counter+"/"+files.length);
       }
4

2 に答える 2

5

まず、ドキュメントを更新するIndexWriter.updateDocument(Term, Document)代わりにを使用する必要がありIndexWriter.addDocumentます。これにより、インデックスに重複したエントリが含まれるのを防ぐことができます。

増分索引作成を実行するにlast-modifiedは、索引の文書にタイム・スタンプを追加し、より新しい文書のみを索引付けする必要があります。

EDIT:インクリメンタルインデックス作成の詳細

ドキュメントには、少なくとも 2 つのフィールドが必要です。

  • ファイルのパス
  • ファイルが最後に変更されたときのタイムスタンプ。

インデックス作成を開始する前に、インデックスで最新のタイム スタンプを検索し、ディレクトリをクロールして、タイム スタンプがインデックスの最新のタイム スタンプよりも新しいすべてのファイルを見つけます。

これにより、ファイルが変更されるたびにインデックスが更新されます。

于 2012-09-17T22:06:25.077 に答える
2

ドキュメントがすでにインデックスに存在するかどうかを確認したい場合IndexSearcher、Lucene インデックスを検索するために使用する関連する Lucene クエリを生成する方法があります。

たとえば、ここでは、フィールドを使用してクエリを作成しfilename、ドキュメントがインデックスに既に存在するかどうかを確認できますpathcontent

Lucene に提供するフルテキスト クエリを生成するには、Lucene クエリ構文にIndexSearcher加えてandが必要です(例:IndexWriter

 filename:myfile path:mypath content:mycontent

)。

IndexSearcher indexSearcher = new IndexSearcher(directory);

String query = // generate your query

indexSearcher.search(query, collector);

上記のコードにcollectorは、インデックス内の一部のデータがクエリと一致する場合にドキュメント ID で呼び出されるコールバック メソッド collect が含まれています。

于 2012-09-17T15:44:19.967 に答える