View Javadoc

1   package org.apache.lucene.index;
2   
3   import org.apache.lucene.store.*;
4   
5   import java.io.IOException;
6   import java.util.Iterator;
7   import java.util.List;
8   import java.util.Vector;
9   
10  public class IndexUtils
11  {
12      /**
13       * Truncates an index. Instead of deleting all documents in an index via an IndexReader,
14       * All available segments are marked as deleted by their files to the "deletable" file.
15       * This has the benefit of faster index merges, whilst not offending any open readers.
16       * @param dir
17       * @throws IOException
18       */
19      public static void truncateIndex(Directory dir) throws IOException
20      {
21          SegmentInfos segmentInfos = new SegmentInfos();
22          segmentInfos.read(dir);
23          Vector deletable = readDeleteableFiles(dir);
24          String[] indexfiles = dir.list();
25          for (Iterator it = segmentInfos.iterator(); it.hasNext();)
26          {
27              SegmentInfo si = (SegmentInfo) it.next();
28              for (int i = 0; i < indexfiles.length; ++i)
29              {
30                  if (indexfiles[i].startsWith(si.name)) deletable.add(indexfiles[i]);
31              }
32          }
33          writeDeleteableFiles(dir, deletable);
34          segmentInfos.clear();
35          segmentInfos.write(dir);
36      }
37  
38  
39      static Vector readDeleteableFiles(Directory directory) throws IOException
40      {
41          Vector result = new Vector();
42          if (!directory.fileExists("deletable"))
43              return result;
44  
45          IndexInput input = directory.openInput("deletable");
46          try
47          {
48              for (int i = input.readInt(); i > 0; i--)      // read file names
49                  result.addElement(input.readString());
50          }
51          finally
52          {
53              input.close();
54          }
55          return result;
56      }
57  
58      private static void writeDeleteableFiles(Directory directory, List files) throws IOException
59      {
60          IndexOutput output = directory.createOutput("deleteable.new");
61          try
62          {
63              output.writeInt(files.size());
64              for (Iterator it = files.iterator(); it.hasNext();)
65                  output.writeString((String) it.next());
66          }
67          finally
68          {
69              output.close();
70          }
71          directory.renameFile("deleteable.new", "deletable");
72      }
73  }