Lucene IndexWriter添加文档很慢

我写了一个小循环,在IndexWriter中添加了10,000个文档,并且它一直都是这样做的。

有没有其他方法可以索引大量文档?

我问,因为当它上线时,它必须加载15,000条记录。

另一个问题是,当重新启动Web应用程序时,如何防止必须再次加载所有记录?

编辑

这是我使用的代码;

for (int t = 0; t < 10000; t++){ doc = new Document(); text = "Value" + t.toString(); doc.Add(new Field("Value", text, Field.Store.YES, Field.Index.TOKENIZED)); iwriter.AddDocument(doc); }; 

编辑2

  Analyzer analyzer = new StandardAnalyzer(); Directory directory = new RAMDirectory(); IndexWriter iwriter = new IndexWriter(directory, analyzer, true); iwriter.SetMaxFieldLength(25000); 

然后是添加文档的代码;

  iwriter.Close(); 

只是检查,但你运行它时没有连接调试器吗?

这会严重影响添加文档时的性能。

在我的机器上(Lucene 2.0.0.4):

使用平台目标x86构建:

  • 没有调试器 – 5.2秒

  • 附加调试器 – 113.8秒

使用平台目标x64构建:

  • 没有调试器 – 6.0秒

  • 附加调试器 – 171.4秒

保存和加载RAMDirectory索引的粗略示例:

 const int DocumentCount = 10 * 1000; const string IndexFilePath = @"X:\Temp\tmp.idx"; Analyzer analyzer = new StandardAnalyzer(); Directory ramDirectory = new RAMDirectory(); IndexWriter indexWriter = new IndexWriter(ramDirectory, analyzer, true); for (int i = 0; i < DocumentCount; i++) { Document doc = new Document(); string text = "Value" + i; doc.Add(new Field("Value", text, Field.Store.YES, Field.Index.TOKENIZED)); indexWriter.AddDocument(doc); } indexWriter.Close(); //Save index FSDirectory fileDirectory = FSDirectory.GetDirectory(IndexFilePath, true); IndexWriter fileIndexWriter = new IndexWriter(fileDirectory, analyzer, true); fileIndexWriter.AddIndexes(new[] { ramDirectory }); fileIndexWriter.Close(); //Load index FSDirectory newFileDirectory = FSDirectory.GetDirectory(IndexFilePath, false); Directory newRamDirectory = new RAMDirectory(); IndexWriter newIndexWriter = new IndexWriter(newRamDirectory, analyzer, true); newIndexWriter.AddIndexes(new[] { newFileDirectory }); Console.WriteLine("New index writer document count:{0}.", newIndexWriter.DocCount()); 

你应该这样做以获得最佳性能。 在我的机器上,我在1秒钟内索引1000个文档

1)每次添加这样的文档时,都应该重复使用(Document,Field)

 private static void IndexingThread(object contextObj) { Range range = (Range)contextObj; Document newDoc = new Document(); newDoc.Add(new Field("title", "", Field.Store.NO, Field.Index.ANALYZED)); newDoc.Add(new Field("body", "", Field.Store.NO, Field.Index.ANALYZED)); newDoc.Add(new Field("newsdate", "", Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS)); newDoc.Add(new Field("id", "", Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS)); for (int counter = range.Start; counter <= range.End; counter++) { newDoc.GetField("title").SetValue(Entities[counter].Title); newDoc.GetField("body").SetValue(Entities[counter].Body); newDoc.GetField("newsdate").SetValue(Entities[counter].NewsDate); newDoc.GetField("id").SetValue(Entities[counter].ID.ToString()); writer.AddDocument(newDoc); } } 

之后你可以使用线程并将你的大集合分成更小的集合,并为每个部分使用上面的代码,例如,如果你有10,000个文档,你可以使用ThreadPool创建10个线程,并将每个部分提供给一个线程进行索引

然后你将获得最佳表现。