2012-05-05 10 views
12

私はJavaとLuceneを初めて使用しています。私のコードは、ファイルから行を取得し、それをLucene Indexに格納します。しかし、インデックスを検索して読み込むためにIndexReaderを作成すると、例外がスローされます。org.apache.lucene.index.IndexNotFoundException:org.apache.lucene.store.RAMDirectoryでセグメント*ファイルが見つかりません

私のJavaコードは以下の通りです。 IndexReaderを作成するには、それはあなたがインデックスライターを閉じ、IndexReaderを開く必要がインデックスに変更を書き込むためにIndexNotFoundException

static String itemsfreq[]; 
static StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_35); 
static IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_35, analyzer); 

public static void index_data(Directory indexed_document,int doc_num,IndexWriter w) throws IOException 
    { 
    for(int i = 0;i < itemsfreq.length;i++) 
     { 
     Document doc = new Document(); 
     doc.add(new Field(Integer.toString(doc_num)+","+itemsfreq[i],itemsfreq[i++], Field.Store.YES, Field.Index.ANALYZED)); 
     w.addDocument(doc); 
     } 
    } 
//Gets string from a file and insert it in INDEX named indexed_document 
public static void main(String[] args) throws IOException 
    { 
    BufferedReader reader = new BufferedReader(new FileReader("fullText100.txt")); 
    String line; 
    int i = 0; 
    Directory indexed_document = new RAMDirectory(); 
    IndexWriter writer = new IndexWriter(indexed_document, config); 
    while((line=reader.readLine()) != null) 
     { 
     if(i == 1) 
      { 
      break; 
      } 
     itemsfreq = line.split(" "); 
     index_data(indexed_document,i,writer); 
     i++; 
     } 

    IndexReader r = IndexReader.open(indexed_document); 
    } 

答えて

14

をスローします。

writer.close(); 

あなたは書き込みが完了する前にIndexReaderをオープンする必要がある場合は、変更を確認するために、インデックスを再オープンするIndexReaderを伝える必要があります。

+0

私はこのソリューションを適用し、それが働きました。 –

16

オープン前にリーダーを使用することにより、インデックスは、明示的にIndexSearcherを開く前にコミット呼び出すために一度writer.commit()

+1

私は同様の問題に直面していて、 'writer.commit()'を使って修正しました。 'writer.close()'を使用していた場合、私は再度ライターを開く必要があります。あなたの提案は以前のものよりも優れています。 – tuxdna

+2

実際、これは、Lucene docsがIndexWriterとIndexReaderの単一のインスタンスを再利用することを推奨しているため、正しいソリューションです。この方法で私は作家を閉じて、必要なときに再び作成する必要はありません。 – Serg

3

あなたがする必要がある呼び出します。

directory = new RAMDirectory(); 
    iwriter = new IndexWriter(directory, config); 
    iwriter.commit(); 

がオープンしましサーチャー

ireader = DirectoryReader.open(directory); 
isearcher = new IndexSearcher(ireader); 

はまた、あなたがそうでなければそれを見つけられないことがあり、検索のドキュメントを追加した後にコミット呼び出す必要があります覚えておいてください。サーチャーはコミット後に再オープンする必要があります(もちろん、古いサーチャーを終了してください)。

iwriter.commit(); 
0

私はメモリ内に私のファイルシステムとFSDirectoryの適切なディレクトリを作成することによって、インデックスを作成していたが、実際にはまだドキュメントを追加していなかったので、私は(Lucene.Net、C#で)このエラーを得ました。

具体的には、新しい文書を追加するコードでは、リーダーで重複が追加されていないことを確認していましたが、最初の文書を追加しようとすると例外がスローされました。

私はそうのように、この取り扱わ:

// Make a reader to check the index for duplicates 
// The reader will only be aware of items that were in the index before it was created 
IndexReader reader = null; 
try { 
    reader = IndexReader.Open(index, true); 
} catch(IOException) { 
    // There is no segments file because the index is empty 
    reader = null; 
} 

... // inside a method called by that scope, with reader passed in 

// See if it exists already 
// If the reader is null, then the index is empty 
if(reader != null) { 
    var existsTerm = new Term(SingleFieldIndexManager.FieldName, formattedTerm); 
    var matches = reader.TermDocs(existsTerm); 
    if(matches.Next()) { 
     // It's already in there, no need to add again 
     return; 
    } 
} 

... // back to the first method after a return 

// dispose of the reader if we managed to create one 
if(reader != null) { 
    reader.Dispose(); 
} 
+0

ねえ、私はあなたと同じ問題を抱えています。しかし、私はあなたがそれをどのように解決したのか理解していません。ファイルがない場合、catchブロックに入ります。それはそうですか? – Valentin

+0

問題が見つかりました。パラメータcreate = falseを指定してIndexWriterを作成する際にこのエラーが発生する – Valentin

関連する問題