每次运行Lucene索引时,它都会变得越来越慢
问题描述:
此代码使用Lucene.NET测试索引。每次运行Lucene索引时,它都会变得越来越慢
for (int i = 0; i < 10; i++)
{
var stopwatch = Stopwatch.StartNew();
string indexPath = Path.Combine("C:\\lucene\\");
var directory = FSDirectory.Open(new DirectoryInfo(indexPath));
var analyzer = new StandardAnalyzer(LuceneConfiguration.Version);
IndexWriter indexWriter = null;
try
{
indexWriter = new IndexWriter(directory, analyzer, true,
IndexWriter.MaxFieldLength.UNLIMITED);
indexWriter.DeleteAll();
for (int documentNumber = 0; documentNumber < 100; documentNumber++)
{
var document = new Document();
for (int fieldNumber = 0; fieldNumber < 10; fieldNumber++)
{
document.Add(new Field("Field" + fieldNumber, "asdf qwerty Value" + fieldNumber, Field.Store.YES,
Field.Index.ANALYZED));
}
indexWriter.AddDocument(document);
}
indexWriter.Optimize();
}
finally
{
if (indexWriter != null)
{
indexWriter.Close();
}
}
stopwatch.Stop();
Console.WriteLine("Index time: " + stopwatch.Elapsed.TotalMilliseconds);
var reader = IndexReader.Open(directory, true);
var searcher = new IndexSearcher(reader);
var parser = new QueryParser(LuceneConfiguration.Version, "Field0", analyzer);
var query = parser.Parse("asdf");
var collector = TopScoreDocCollector.create(10, true);
searcher.Search(query, collector);
Console.WriteLine("Hits: " + collector.GetTotalHits());
}
Console.ReadKey();
对于每次索引运行时,索引变得越来越慢。如果我在索引后跳过搜索,它不会变慢。这只发生在我用调试开始时。不,如果我没有调试就启动它。
什么可能导致这种情况?
答
我在想,如果这是第一次在Lucene尝试自动清除索引目录时发生IOException异常。这些会发生,因为您的读者/搜索者仍然处于打开状态,并锁定段文件以进行删除。
+0
我认为你是对的。看起来像Lucene抛出了很多例外,使得它在调试时变得缓慢...... – Allrameest 2011-04-04 13:49:44
我没有看到明确的'.Commit()'你是否自动提交某种?你是在分析相同的构建还是使用一个调试构建和另一个构建版本? – skarmats 2011-03-31 09:11:47
indexWrite.Close()提交它。如果我在发行版或调试版中运行它无关紧要。 – Allrameest 2011-03-31 09:19:20
啊,如果我在调试时运行它会很慢。如果我在没有调试的情况下启动它,它总是很快。 – Allrameest 2011-03-31 09:21:23