2009-07-02 15 views
1

私はLucene.NET 2.3.1をMultiSearcherで使用しています。なぜLuceneはドキュメントを削除しないのですか?

テストの目的で、私は約10000行のデータベースを索引付けしています。私は2つのインデックスがあり、ランダムに選択して各行を挿入します。これは正しく動作しますが、Luceneには更新機能がないため、行が存在するかどうかをテストしなければなりません。

私はリストとリストがあり、それぞれが、このコードを使用して作成されます

IndexModifier mod = new IndexModifier(path, new StandardAnalyzer(), create); 
m_Modifiers.Add(mod); 
m_Readers.Add(IndexReader.Open(path)); 
m_Searchers.Add(new IndexSearcher(path)); 

今すぐ削除コード:

Hits results = m_Searcher.Search(new TermQuery(t)); 

for (int i = 0; i < results.Length(); i++) 
{ 
    DocId = results .Id(i); 
    Index = m_Searcher.SubSearcher(DocId); 
    DocId = m_Searcher.SubDoc(DocId); 

    m_Modifiers[Index].DeleteDocument(DocId); 
} 

検索が正しいと私は場合の結果を得ているが行が存在します。 SubSearcherは常に0または1を返します.Indexが0の場合、SubDocは渡された同じIDを返し、1の場合は、渡された数値から5000を引いた数を返します。あたかも何も削除していないかのようです。

私はデータベースをインデックスするたびにインデックスを最適化して終了し、Lukeには保留中の削除はないと言います。

何が問題なのですか?

答えて

0

私はこのアクティビティの最終目標がわからないため、次の解決策が要件を満たしていない場合はご容赦ください。

最初に、ドキュメントを削除する場合は、既に作成したIndexReaderを使用できます。 IndexModifierは必須ではありません。

第2に、サブセーチャーIDと文書IDをそのサブセーチャーで見つける必要はありません。最上位のMultiReaderを使用することもできます。次のように、同等のJavaコードを記述します。

IndexReader[] readers = new IndexReader[size]; 
// Initialize readers 
MultiReader multiReader = new MultiReader(readers); 

IndexSearcher searcher = new IndexSearcher(multiReader); 
Hits results = searcher.search(new TermQuery(t)); 
for (int i = 0; i < results.length(); i++) { 
    int docID = results.id(i); 
    multiReader.deleteDocument(docID); 
} 
multiReader.commit(); // Check if this throws an exception. 
multiReader.close(); 
searcher.close(); 
+0

最後に、私はそれを自分で解決しました。私の問題は、実際にはUN_TOKENIZEDでなければならないフィールドであり、TOKENIZEDでした。 私が正しく覚えていれば、multiReaderで削除するためにはModifierを閉じる必要がありました。ほとんどの削除はドキュメントの更新の一部として行われるため、閉じずに直接削除することをお勧めします修飾子。私は正しいのですか、それとも良い解決策がありますか? –

関連する問題