gri*_*egs 7 c# lucene lucene.net
我写了一个小循环,它将10,000个文档添加到IndexWriter中,并且它始终需要这样做.
有没有其他方法可以索引大量文档?
我问,因为当它上线时,它必须加载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);
};
Run Code Online (Sandbox Code Playgroud)
编辑2
Analyzer analyzer = new StandardAnalyzer();
Directory directory = new RAMDirectory();
IndexWriter iwriter = new IndexWriter(directory, analyzer, true);
iwriter.SetMaxFieldLength(25000);
Run Code Online (Sandbox Code Playgroud)
然后是添加文档的代码;
iwriter.Close();
Run Code Online (Sandbox Code Playgroud)
Ehs*_*san 10
你应该这样做以获得最佳性能.在我的机器上,我在1秒钟内索引1000个文件
1)每次添加这样的文档时,都应该重复使用(Document,Field)
private static void IndexingThread(object contextObj)
{
Range<int> range = (Range<int>)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);
}
}
Run Code Online (Sandbox Code Playgroud)
之后你可以使用线程并将你的大集合分解成更小的集合,并为每个部分使用上面的代码,例如,如果你有10,000个文档,你可以使用ThreadPool创建10个线程,并将每个部分提供给一个线程进行索引
然后你将获得最佳表现.
只是检查,但你运行它时没有连接调试器吗?
这会严重影响添加文档时的性能.
在我的机器上(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());
Run Code Online (Sandbox Code Playgroud)