public virtual void TestDocCount() { Directory dir = new RAMDirectory(); IndexWriter writer = null; IndexReader reader = null; int i; try { writer = new IndexWriter(dir, new WhitespaceAnalyzer(), true); // add 100 documents for (i = 0; i < 100; i++) { AddDoc(writer); } Assert.AreEqual(100, writer.DocCount()); writer.Close(); // delete 40 documents reader = IndexReader.Open(dir); for (i = 0; i < 40; i++) { reader.Delete(i); } reader.Close(); // test doc count before segments are merged/index is optimized writer = new IndexWriter(dir, new WhitespaceAnalyzer(), false); Assert.AreEqual(100, writer.DocCount()); writer.Close(); reader = IndexReader.Open(dir); Assert.AreEqual(100, reader.MaxDoc()); Assert.AreEqual(60, reader.NumDocs()); reader.Close(); // optimize the index and check that the new doc count is correct writer = new IndexWriter(dir, new WhitespaceAnalyzer(), false); writer.Optimize(); Assert.AreEqual(60, writer.DocCount()); writer.Close(); // check that the index reader gives the same numbers. reader = IndexReader.Open(dir); Assert.AreEqual(60, reader.MaxDoc()); Assert.AreEqual(60, reader.NumDocs()); reader.Close(); } catch (System.IO.IOException e) { System.Console.Error.WriteLine(e.StackTrace); } }
public virtual void TestBasicDelete() { Directory dir = new RAMDirectory(); IndexWriter writer = null; IndexReader reader = null; Term searchTerm = new Term("content", "aaa"); // add 100 documents with term : aaa writer = new IndexWriter(dir, new WhitespaceAnalyzer(), true); for (int i = 0; i < 100; i++) { AddDoc(writer, searchTerm.Text()); } writer.Close(); // OPEN READER AT THIS POINT - this should fix the view of the // index at the point of having 100 "aaa" documents and 0 "bbb" reader = IndexReader.Open(dir); Assert.AreEqual(100, reader.DocFreq(searchTerm), "first docFreq"); AssertTermDocsCount("first reader", reader, searchTerm, 100); // DELETE DOCUMENTS CONTAINING TERM: aaa int deleted = 0; reader = IndexReader.Open(dir); deleted = reader.Delete(searchTerm); Assert.AreEqual(100, deleted, "deleted count"); Assert.AreEqual(100, reader.DocFreq(searchTerm), "deleted docFreq"); AssertTermDocsCount("deleted termDocs", reader, searchTerm, 0); reader.Close(); // CREATE A NEW READER and re-test reader = IndexReader.Open(dir); Assert.AreEqual(100, reader.DocFreq(searchTerm), "deleted docFreq"); AssertTermDocsCount("deleted termDocs", reader, searchTerm, 0); reader.Close(); }
private void DeleteReaderReaderConflict(bool optimize) { Directory dir = GetDirectory(true); Term searchTerm1 = new Term("content", "aaa"); Term searchTerm2 = new Term("content", "bbb"); Term searchTerm3 = new Term("content", "ccc"); // add 100 documents with term : aaa // add 100 documents with term : bbb // add 100 documents with term : ccc IndexWriter writer = new IndexWriter(dir, new WhitespaceAnalyzer(), true); for (int i = 0; i < 100; i++) { AddDoc(writer, searchTerm1.Text()); AddDoc(writer, searchTerm2.Text()); AddDoc(writer, searchTerm3.Text()); } if (optimize) { writer.Optimize(); } writer.Close(); // OPEN TWO READERS // Both readers get segment info as exists at this time IndexReader reader1 = IndexReader.Open(dir); Assert.AreEqual(100, reader1.DocFreq(searchTerm1), "first opened"); Assert.AreEqual(100, reader1.DocFreq(searchTerm2), "first opened"); Assert.AreEqual(100, reader1.DocFreq(searchTerm3), "first opened"); AssertTermDocsCount("first opened", reader1, searchTerm1, 100); AssertTermDocsCount("first opened", reader1, searchTerm2, 100); AssertTermDocsCount("first opened", reader1, searchTerm3, 100); IndexReader reader2 = IndexReader.Open(dir); Assert.AreEqual(100, reader2.DocFreq(searchTerm1), "first opened"); Assert.AreEqual(100, reader2.DocFreq(searchTerm2), "first opened"); Assert.AreEqual(100, reader2.DocFreq(searchTerm3), "first opened"); AssertTermDocsCount("first opened", reader2, searchTerm1, 100); AssertTermDocsCount("first opened", reader2, searchTerm2, 100); AssertTermDocsCount("first opened", reader2, searchTerm3, 100); // DELETE DOCS FROM READER 2 and CLOSE IT // delete documents containing term: aaa // when the reader is closed, the segment info is updated and // the first reader is now stale reader2.Delete(searchTerm1); Assert.AreEqual(100, reader2.DocFreq(searchTerm1), "after delete 1"); Assert.AreEqual(100, reader2.DocFreq(searchTerm2), "after delete 1"); Assert.AreEqual(100, reader2.DocFreq(searchTerm3), "after delete 1"); AssertTermDocsCount("after delete 1", reader2, searchTerm1, 0); AssertTermDocsCount("after delete 1", reader2, searchTerm2, 100); AssertTermDocsCount("after delete 1", reader2, searchTerm3, 100); reader2.Close(); // Make sure reader 1 is unchanged since it was open earlier Assert.AreEqual(100, reader1.DocFreq(searchTerm1), "after delete 1"); Assert.AreEqual(100, reader1.DocFreq(searchTerm2), "after delete 1"); Assert.AreEqual(100, reader1.DocFreq(searchTerm3), "after delete 1"); AssertTermDocsCount("after delete 1", reader1, searchTerm1, 100); AssertTermDocsCount("after delete 1", reader1, searchTerm2, 100); AssertTermDocsCount("after delete 1", reader1, searchTerm3, 100); // ATTEMPT TO DELETE FROM STALE READER // delete documents containing term: bbb try { reader1.Delete(searchTerm2); Assert.Fail("Delete allowed from a stale index reader"); } catch (System.IO.IOException e) { /* success */ } // RECREATE READER AND TRY AGAIN reader1.Close(); reader1 = IndexReader.Open(dir); Assert.AreEqual(100, reader1.DocFreq(searchTerm1), "reopened"); Assert.AreEqual(100, reader1.DocFreq(searchTerm2), "reopened"); Assert.AreEqual(100, reader1.DocFreq(searchTerm3), "reopened"); AssertTermDocsCount("reopened", reader1, searchTerm1, 0); AssertTermDocsCount("reopened", reader1, searchTerm2, 100); AssertTermDocsCount("reopened", reader1, searchTerm3, 100); reader1.Delete(searchTerm2); Assert.AreEqual(100, reader1.DocFreq(searchTerm1), "deleted 2"); Assert.AreEqual(100, reader1.DocFreq(searchTerm2), "deleted 2"); Assert.AreEqual(100, reader1.DocFreq(searchTerm3), "deleted 2"); AssertTermDocsCount("deleted 2", reader1, searchTerm1, 0); AssertTermDocsCount("deleted 2", reader1, searchTerm2, 0); AssertTermDocsCount("deleted 2", reader1, searchTerm3, 100); reader1.Close(); // Open another reader to confirm that everything is deleted reader2 = IndexReader.Open(dir); Assert.AreEqual(100, reader2.DocFreq(searchTerm1), "reopened 2"); Assert.AreEqual(100, reader2.DocFreq(searchTerm2), "reopened 2"); Assert.AreEqual(100, reader2.DocFreq(searchTerm3), "reopened 2"); AssertTermDocsCount("reopened 2", reader2, searchTerm1, 0); AssertTermDocsCount("reopened 2", reader2, searchTerm2, 0); AssertTermDocsCount("reopened 2", reader2, searchTerm3, 100); reader2.Close(); dir.Close(); }
private void DeleteReaderWriterConflict(bool optimize) { //Directory dir = new RAMDirectory(); Directory dir = GetDirectory(true); Term searchTerm = new Term("content", "aaa"); Term searchTerm2 = new Term("content", "bbb"); // add 100 documents with term : aaa IndexWriter writer = new IndexWriter(dir, new WhitespaceAnalyzer(), true); for (int i = 0; i < 100; i++) { AddDoc(writer, searchTerm.Text()); } writer.Close(); // OPEN READER AT THIS POINT - this should fix the view of the // index at the point of having 100 "aaa" documents and 0 "bbb" IndexReader reader = IndexReader.Open(dir); Assert.AreEqual(100, reader.DocFreq(searchTerm), "first docFreq"); Assert.AreEqual(0, reader.DocFreq(searchTerm2), "first docFreq"); AssertTermDocsCount("first reader", reader, searchTerm, 100); AssertTermDocsCount("first reader", reader, searchTerm2, 0); // add 100 documents with term : bbb writer = new IndexWriter(dir, new WhitespaceAnalyzer(), false); for (int i = 0; i < 100; i++) { AddDoc(writer, searchTerm2.Text()); } // REQUEST OPTIMIZATION // This causes a new segment to become current for all subsequent // searchers. Because of this, deletions made via a previously open // reader, which would be applied to that reader's segment, are lost // for subsequent searchers/readers if (optimize) { writer.Optimize(); } writer.Close(); // The reader should not see the new data Assert.AreEqual(100, reader.DocFreq(searchTerm), "first docFreq"); Assert.AreEqual(0, reader.DocFreq(searchTerm2), "first docFreq"); AssertTermDocsCount("first reader", reader, searchTerm, 100); AssertTermDocsCount("first reader", reader, searchTerm2, 0); // DELETE DOCUMENTS CONTAINING TERM: aaa // NOTE: the reader was created when only "aaa" documents were in int deleted = 0; try { deleted = reader.Delete(searchTerm); Assert.Fail("Delete allowed on an index reader with stale segment information"); } catch (System.IO.IOException e) { /* success */ } // Re-open index reader and try again. This time it should see // the new data. reader.Close(); reader = IndexReader.Open(dir); Assert.AreEqual(100, reader.DocFreq(searchTerm), "first docFreq"); Assert.AreEqual(100, reader.DocFreq(searchTerm2), "first docFreq"); AssertTermDocsCount("first reader", reader, searchTerm, 100); AssertTermDocsCount("first reader", reader, searchTerm2, 100); deleted = reader.Delete(searchTerm); Assert.AreEqual(100, deleted, "deleted count"); Assert.AreEqual(100, reader.DocFreq(searchTerm), "deleted docFreq"); Assert.AreEqual(100, reader.DocFreq(searchTerm2), "deleted docFreq"); AssertTermDocsCount("deleted termDocs", reader, searchTerm, 0); AssertTermDocsCount("deleted termDocs", reader, searchTerm2, 100); reader.Close(); // CREATE A NEW READER and re-test reader = IndexReader.Open(dir); Assert.AreEqual(100, reader.DocFreq(searchTerm), "deleted docFreq"); Assert.AreEqual(100, reader.DocFreq(searchTerm2), "deleted docFreq"); AssertTermDocsCount("deleted termDocs", reader, searchTerm, 0); AssertTermDocsCount("deleted termDocs", reader, searchTerm2, 100); reader.Close(); }
protected internal override void DoDelete(int n) { in_Renamed.Delete(n); }