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