Command-line interface to check and fix an index.
///
/// Run it like this:
///
/// java -ea:Lucene.Net... Lucene.Net.Index.CheckIndex pathToIndex [-fix] [-segment X] [-segment Y]
///
///
/// -fix
: actually write a new segments_N file, removing any problematic segments
/// -segment X
: only check the specified
/// segment(s). This can be specified multiple times,
/// to check more than one segment, eg -segment _2
/// -segment _a
. You can't use this with the -fix
/// option.
///
/// WARNING: -fix
should only be used on an emergency basis as it will cause
/// documents (perhaps many) to be permanently removed from the index. Always make
/// a backup copy of your index before running this! Do not run this tool on an index
/// that is actively being written to. You have been warned!
/// Run without -fix, this tool will open the index, report version information
/// and report any exceptions it hits and what action it would take if -fix were
/// specified. With -fix, this tool will remove any segments that have issues and
/// write a new segments_N file. This means all documents contained in the affected
/// segments will be removed.
///
/// This tool exits with exit code 1 if the index cannot be opened or has any
/// corruption, else 0.
///
[STAThread]
public static void Main(System.String[] args)
{
bool doFix = false;
System.Collections.IList onlySegments = new System.Collections.ArrayList();
System.String indexPath = null;
int i = 0;
while (i < args.Length)
{
if (args[i].Equals("-fix"))
{
doFix = true;
i++;
}
else if (args[i].Equals("-segment"))
{
if (i == args.Length - 1)
{
System.Console.Out.WriteLine("ERROR: missing name for -segment option");
System.Environment.Exit(1);
}
onlySegments.Add(args[i + 1]);
i += 2;
}
else
{
if (indexPath != null)
{
System.Console.Out.WriteLine("ERROR: unexpected extra argument '" + args[i] + "'");
System.Environment.Exit(1);
}
indexPath = args[i];
i++;
}
}
if (indexPath == null)
{
System.Console.Out.WriteLine("\nERROR: index path not specified");
System.Console.Out.WriteLine("\nUsage: java Lucene.Net.Index.CheckIndex pathToIndex [-fix] [-segment X] [-segment Y]\n" + "\n" + " -fix: actually write a new segments_N file, removing any problematic segments\n" + " -segment X: only check the specified segments. This can be specified multiple\n" + " times, to check more than one segment, eg '-segment _2 -segment _a'.\n" + " You can't use this with the -fix option\n" + "\n" + "**WARNING**: -fix should only be used on an emergency basis as it will cause\n" + "documents (perhaps many) to be permanently removed from the index. Always make\n" + "a backup copy of your index before running this! Do not run this tool on an index\n" + "that is actively being written to. You have been warned!\n" + "\n" + "Run without -fix, this tool will open the index, report version information\n" + "and report any exceptions it hits and what action it would take if -fix were\n" + "specified. With -fix, this tool will remove any segments that have issues and\n" + "write a new segments_N file. This means all documents contained in the affected\n" + "segments will be removed.\n" + "\n" + "This tool exits with exit code 1 if the index cannot be opened or has any\n" + "corruption, else 0.\n");
System.Environment.Exit(1);
}
if (!AssertsOn())
System.Console.Out.WriteLine("\nNOTE: testing will be more thorough if you run java with '-ea:Lucene.Net...', so assertions are enabled");
if (onlySegments.Count == 0)
onlySegments = null;
else if (doFix)
{
System.Console.Out.WriteLine("ERROR: cannot specify both -fix and -segment");
System.Environment.Exit(1);
}
System.Console.Out.WriteLine("\nOpening index @ " + indexPath + "\n");
Directory dir = null;
try
{
dir = FSDirectory.Open(new System.IO.FileInfo(indexPath));
}
catch (System.Exception t)
{
System.Console.Out.WriteLine("ERROR: could not open directory \"" + indexPath + "\"; exiting");
System.Console.Out.WriteLine(t.StackTrace);
System.Environment.Exit(1);
}
CheckIndex checker = new CheckIndex(dir);
System.IO.StreamWriter temp_writer;
temp_writer = new System.IO.StreamWriter(System.Console.OpenStandardOutput(), System.Console.Out.Encoding);
temp_writer.AutoFlush = true;
checker.SetInfoStream(temp_writer);
Status result = checker.CheckIndex_Renamed_Method(onlySegments);
if (result.missingSegments)
{
System.Environment.Exit(1);
}
if (!result.clean)
{
if (!doFix)
{
System.Console.Out.WriteLine("WARNING: would write new segments file, and " + result.totLoseDocCount + " documents would be lost, if -fix were specified\n");
}
else
{
System.Console.Out.WriteLine("WARNING: " + result.totLoseDocCount + " documents will be lost\n");
System.Console.Out.WriteLine("NOTE: will write new segments file in 5 seconds; this will remove " + result.totLoseDocCount + " docs from the index. THIS IS YOUR LAST CHANCE TO CTRL+C!");
for (int s = 0; s < 5; s++)
{
System.Threading.Thread.Sleep(new System.TimeSpan((System.Int64) 10000 * 1000));
System.Console.Out.WriteLine(" " + (5 - s) + "...");
}
System.Console.Out.WriteLine("Writing...");
checker.FixIndex(result);
System.Console.Out.WriteLine("OK");
System.Console.Out.WriteLine("Wrote new segments file \"" + result.newSegments.GetCurrentSegmentFileName() + "\"");
}
}
System.Console.Out.WriteLine("");
int exitCode;
if (result != null && result.clean == true)
exitCode = 0;
else
exitCode = 1;
System.Environment.Exit(exitCode);
}
}
}