📄 testindexwriter.java
字号:
// add one document & close writer IndexWriter writer = new IndexWriter(dir, new WhitespaceAnalyzer(), true); addDoc(writer); writer.close(); // now open reader: IndexReader reader = IndexReader.open(dir); assertEquals("should be one document", reader.numDocs(), 1); // now open index for create: writer = new IndexWriter(dir, new WhitespaceAnalyzer(), true); assertEquals("should be zero documents", writer.docCount(), 0); addDoc(writer); writer.close(); assertEquals("should be one document", reader.numDocs(), 1); IndexReader reader2 = IndexReader.open(dir); assertEquals("should be one document", reader2.numDocs(), 1); reader.close(); reader2.close(); } finally { rmDir(indexDir); } } // Same test as above, but use IndexWriter constructor // that takes File: public void testCreateWithReader2() throws IOException { String tempDir = System.getProperty("java.io.tmpdir"); if (tempDir == null) throw new IOException("java.io.tmpdir undefined, cannot run test"); File indexDir = new File(tempDir, "lucenetestindexwriter"); try { // add one document & close writer IndexWriter writer = new IndexWriter(indexDir, new WhitespaceAnalyzer(), true); addDoc(writer); writer.close(); // now open reader: IndexReader reader = IndexReader.open(indexDir); assertEquals("should be one document", reader.numDocs(), 1); // now open index for create: writer = new IndexWriter(indexDir, new WhitespaceAnalyzer(), true); assertEquals("should be zero documents", writer.docCount(), 0); addDoc(writer); writer.close(); assertEquals("should be one document", reader.numDocs(), 1); IndexReader reader2 = IndexReader.open(indexDir); assertEquals("should be one document", reader2.numDocs(), 1); reader.close(); reader2.close(); } finally { rmDir(indexDir); } } // Same test as above, but use IndexWriter constructor // that takes String: public void testCreateWithReader3() throws IOException { String tempDir = System.getProperty("tempDir"); if (tempDir == null) throw new IOException("java.io.tmpdir undefined, cannot run test"); String dirName = tempDir + "/lucenetestindexwriter"; try { // add one document & close writer IndexWriter writer = new IndexWriter(dirName, new WhitespaceAnalyzer(), true); addDoc(writer); writer.close(); // now open reader: IndexReader reader = IndexReader.open(dirName); assertEquals("should be one document", reader.numDocs(), 1); // now open index for create: writer = new IndexWriter(dirName, new WhitespaceAnalyzer(), true); assertEquals("should be zero documents", writer.docCount(), 0); addDoc(writer); writer.close(); assertEquals("should be one document", reader.numDocs(), 1); IndexReader reader2 = IndexReader.open(dirName); assertEquals("should be one document", reader2.numDocs(), 1); reader.close(); reader2.close(); } finally { rmDir(new File(dirName)); } } // Simulate a writer that crashed while writing segments // file: make sure we can still open the index (ie, // gracefully fallback to the previous segments file), // and that we can add to the index: public void testSimulatedCrashedWriter() throws IOException { Directory dir = new RAMDirectory(); IndexWriter writer = null; writer = new IndexWriter(dir, new WhitespaceAnalyzer(), true); // add 100 documents for (int i = 0; i < 100; i++) { addDoc(writer); } // close writer.close(); long gen = SegmentInfos.getCurrentSegmentGeneration(dir); assertTrue("segment generation should be > 1 but got " + gen, gen > 1); // Make the next segments file, with last byte // missing, to simulate a writer that crashed while // writing segments file: String fileNameIn = SegmentInfos.getCurrentSegmentFileName(dir); String fileNameOut = IndexFileNames.fileNameFromGeneration(IndexFileNames.SEGMENTS, "", 1+gen); IndexInput in = dir.openInput(fileNameIn); IndexOutput out = dir.createOutput(fileNameOut); long length = in.length(); for(int i=0;i<length-1;i++) { out.writeByte(in.readByte()); } in.close(); out.close(); IndexReader reader = null; try { reader = IndexReader.open(dir); } catch (Exception e) { fail("reader failed to open on a crashed index"); } reader.close(); try { writer = new IndexWriter(dir, new WhitespaceAnalyzer(), true); } catch (Exception e) { fail("writer failed to open on a crashed index"); } // add 100 documents for (int i = 0; i < 100; i++) { addDoc(writer); } // close writer.close(); } // Simulate a corrupt index by removing last byte of // latest segments file and make sure we get an // IOException trying to open the index: public void testSimulatedCorruptIndex1() throws IOException { Directory dir = new RAMDirectory(); IndexWriter writer = null; writer = new IndexWriter(dir, new WhitespaceAnalyzer(), true); // add 100 documents for (int i = 0; i < 100; i++) { addDoc(writer); } // close writer.close(); long gen = SegmentInfos.getCurrentSegmentGeneration(dir); assertTrue("segment generation should be > 1 but got " + gen, gen > 1); String fileNameIn = SegmentInfos.getCurrentSegmentFileName(dir); String fileNameOut = IndexFileNames.fileNameFromGeneration(IndexFileNames.SEGMENTS, "", 1+gen); IndexInput in = dir.openInput(fileNameIn); IndexOutput out = dir.createOutput(fileNameOut); long length = in.length(); for(int i=0;i<length-1;i++) { out.writeByte(in.readByte()); } in.close(); out.close(); dir.deleteFile(fileNameIn); IndexReader reader = null; try { reader = IndexReader.open(dir); fail("reader did not hit IOException on opening a corrupt index"); } catch (Exception e) { } if (reader != null) { reader.close(); } } public void testChangesAfterClose() throws IOException { Directory dir = new RAMDirectory(); IndexWriter writer = null; writer = new IndexWriter(dir, new WhitespaceAnalyzer(), true); addDoc(writer); // close writer.close(); try { addDoc(writer); fail("did not hit AlreadyClosedException"); } catch (AlreadyClosedException e) { // expected } } // Simulate a corrupt index by removing one of the cfs // files and make sure we get an IOException trying to // open the index: public void testSimulatedCorruptIndex2() throws IOException { Directory dir = new RAMDirectory(); IndexWriter writer = null; writer = new IndexWriter(dir, new WhitespaceAnalyzer(), true); // add 100 documents for (int i = 0; i < 100; i++) { addDoc(writer); } // close writer.close(); long gen = SegmentInfos.getCurrentSegmentGeneration(dir); assertTrue("segment generation should be > 1 but got " + gen, gen > 1); String[] files = dir.list(); for(int i=0;i<files.length;i++) { if (files[i].endsWith(".cfs")) { dir.deleteFile(files[i]); break; } } IndexReader reader = null; try { reader = IndexReader.open(dir); fail("reader did not hit IOException on opening a corrupt index"); } catch (Exception e) { } if (reader != null) { reader.close(); } } /* * Simple test for "commit on close": open writer with * autoCommit=false, so it will only commit on close, * then add a bunch of docs, making sure reader does not * see these docs until writer is closed. */ public void testCommitOnClose() throws IOException { Directory dir = new RAMDirectory(); IndexWriter writer = new IndexWriter(dir, new WhitespaceAnalyzer(), true); for (int i = 0; i < 14; i++) { addDoc(writer); } writer.close(); Term searchTerm = new Term("content", "aaa"); IndexSearcher searcher = new IndexSearcher(dir); Hits hits = searcher.search(new TermQuery(searchTerm)); assertEquals("first number of hits", 14, hits.length()); searcher.close(); IndexReader reader = IndexReader.open(dir); writer = new IndexWriter(dir, false, new WhitespaceAnalyzer()); for(int i=0;i<3;i++) { for(int j=0;j<11;j++) { addDoc(writer); } searcher = new IndexSearcher(dir); hits = searcher.search(new TermQuery(searchTerm)); assertEquals("reader incorrectly sees changes from writer with autoCommit disabled", 14, hits.length()); searcher.close(); assertTrue("reader should have still been current", reader.isCurrent()); } // Now, close the writer: writer.close(); assertFalse("reader should not be current now", reader.isCurrent()); searcher = new IndexSearcher(dir); hits = searcher.search(new TermQuery(searchTerm)); assertEquals("reader did not see changes after writer was closed", 47, hits.length()); searcher.close(); } /* * Simple test for "commit on close": open writer with * autoCommit=false, so it will only commit on close, * then add a bunch of docs, making sure reader does not * see them until writer has closed. Then instead of * closing the writer, call abort and verify reader sees * nothing was added. Then verify we can open the index * and add docs to it. */ public void testCommitOnCloseAbort() throws IOException { Directory dir = new RAMDirectory(); IndexWriter writer = new IndexWriter(dir, new WhitespaceAnalyzer(), true); writer.setMaxBufferedDocs(10); for (int i = 0; i < 14; i++) { addDoc(writer); } writer.close(); Term searchTerm = new Term("content", "aaa"); IndexSearcher searcher = new IndexSearcher(dir); Hits hits = searcher.search(new TermQuery(searchTerm)); assertEquals("first number of hits", 14, hits.length()); searcher.close(); writer = new IndexWriter(dir, false, new WhitespaceAnalyzer(), false); writer.setMaxBufferedDocs(10); for(int j=0;j<17;j++) { addDoc(writer); } // Delete all docs: writer.deleteDocuments(searchTerm); searcher = new IndexSearcher(dir); hits = searcher.search(new TermQuery(searchTerm)); assertEquals("reader incorrectly sees changes from writer with autoCommit disabled", 14, hits.length()); searcher.close(); // Now, close the writer: writer.abort(); assertNoUnreferencedFiles(dir, "unreferenced files remain after abort()"); searcher = new IndexSearcher(dir); hits = searcher.search(new TermQuery(searchTerm)); assertEquals("saw changes after writer.abort", 14, hits.length()); searcher.close(); // Now make sure we can re-open the index, add docs, // and all is good: writer = new IndexWriter(dir, false, new WhitespaceAnalyzer(), false); writer.setMaxBufferedDocs(10); for(int i=0;i<12;i++) { for(int j=0;j<17;j++) { addDoc(writer); } searcher = new IndexSearcher(dir); hits = searcher.search(new TermQuery(searchTerm)); assertEquals("reader incorrectly sees changes from writer with autoCommit disabled", 14, hits.length()); searcher.close(); } writer.close(); searcher = new IndexSearcher(dir);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -