2 votes

Comment améliorer la vitesse d'indexation de Lucene.net ?

J'utilise lucene.net pour indexer mes fichiers pdf. Il faut environ 40 minutes pour indexer 15000 pdfs et le temps d'indexation augmente avec le nombre de fichiers pdf dans mon dossier.

  • comment améliorer la vitesse d'indexation dans lucene.net ?
  • Existe-t-il un autre service d'indexation offrant des performances d'indexation rapides ?

J'utilise la dernière version de l'indexation Lucene.net (Lucene.net 3.0.3).

Voici mon code pour l'indexation.

public void refreshIndexes() 
        {
            // Create Index Writer
            string strIndexDir = @"E:\LuceneTest\index";
            IndexWriter writer = new IndexWriter(Lucene.Net.Store.FSDirectory.Open(new System.IO.DirectoryInfo(strIndexDir)), new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29), true, IndexWriter.MaxFieldLength.UNLIMITED);

            // Find all files in root folder create index on them
            List<string> lstFiles = searchFiles(@"E:\LuceneTest\PDFs");
            foreach (string strFile in lstFiles)
            {
                Document doc = new Document();
                string FileName = System.IO.Path.GetFileNameWithoutExtension(strFile);
                string Text = ExtractTextFromPdf(strFile);
                string Path = strFile;
                string ModifiedDate = Convert.ToString(File.GetLastWriteTime(strFile));
                string DocumentType = string.Empty;
                string Vault = string.Empty;

                string headerText = Text.Substring(0, Text.Length < 150 ? Text.Length : 150);
                foreach (var docs in ltDocumentTypes)
                {
                    if (headerText.ToUpper().Contains(docs.searchText.ToUpper()))
                    {
                        DocumentType = docs.DocumentType;
                        Vault = docs.VaultName; ;
                    }
                }

                if (string.IsNullOrEmpty(DocumentType))
                {
                    DocumentType = "Default";
                    Vault = "Default";
                }

                doc.Add(new Field("filename", FileName, Field.Store.YES, Field.Index.ANALYZED));
                doc.Add(new Field("text", Text, Field.Store.YES, Field.Index.ANALYZED));
                doc.Add(new Field("path", Path, Field.Store.YES, Field.Index.NOT_ANALYZED));
                doc.Add(new Field("modifieddate", ModifiedDate, Field.Store.YES, Field.Index.ANALYZED));
                doc.Add(new Field("documenttype", DocumentType, Field.Store.YES, Field.Index.ANALYZED));
                doc.Add(new Field("vault", Vault, Field.Store.YES, Field.Index.ANALYZED));

                writer.AddDocument(doc);
            }
            writer.Optimize();
            writer.Dispose();
        }

0voto

Andy Pook Points 556

La partie indexation semble correcte. Notez que IndexWriter est threadsafe et que l'utilisation de Parallel.Foreach (avec MaxConcurrency réglé sur le nombre de cœurs. Jouez avec cette valeur) sera probablement utile si vous êtes sur une machine multicœur.

Mais vous rendez votre GC fou avec la partie détection du type de document. Tous les ToUpper()s sont douloureux.

  • En dehors de la boucle lstFiles. Créez une copie de ltDocumentTypes .searchText en majuscules.

    var upperDocTypes = ltDocumentTypes.Select(x=>x.searchText.ToUpper()).ToList();
  • en dehors de la boucle des types de documents, créer une autre chaîne

    string headerTestUpper = headerText.ToUpper();
  • Quand il trouve une correspondance, "break". Cela permet de sortir de la boucle une fois que vous avez trouvé une correspondance et empêche toutes les itérations suivantes. Bien sûr, cela signifie qu'il s'agit du premier match, alors que le vôtre est le dernier (si cela fait une différence pour vous).

    string headerText = Text.Substring(0, Text.Length < 150 ? Text.Length : 150);
    foreach (var searchText in upperDocTypes)
    {
        if (headerTextUpper.Contains(searchText))
        {
            DocumentType = docs.DocumentType;
            Vault = docs.VaultName;
            break;
        }
    }

En fonction de la taille de ltDocumentTypes, cela peut ne pas vous apporter beaucoup d'amélioration.

Je parierais que la partie la plus coûteuse est l'extraction du texte du pdf. L'utilisation d'un profileur ou l'instrumentation avec quelques StopWatches vous permettra de savoir où se trouve le coût.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X