代码之家  ›  专栏  ›  技术社区  ›  griegs

Lucene IndexWriter添加文档速度慢

  •  7
  • griegs  · 技术社区  · 14 年前

    我这么问是因为当它上线时,它必须载入15000条记录。

    另一个问题是如何防止在重新启动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();
    
    2 回复  |  直到 14 年前
        1
  •  5
  •   Tim Lloyd    14 年前

    只是检查一下,但是你运行的时候还没有连接调试器,是吗?

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

    • 无调试器-5.2秒

    • 调试器已连接-113.8秒

    使用平台target 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());
    
        2
  •  10
  •   Rajeesh    12 年前

    你应该这样做才能得到最好的表现。在我的机器上,我在1秒内索引了1000个文档

    1) 您应该重用(文档、字段),而不是每次添加这样的文档时都创建

    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);
         }
    }
    

    之后,您可以使用线程技术,将大型集合拆分为较小的集合,并对每个部分使用上述代码 一个用于索引的线程