Как оптимизировать индексацию Lucene.Net - PullRequest
3 голосов
/ 08 октября 2010

Мне нужно проиндексировать около 10 ГБ данных. Каждый из моих «документов» довольно маленький, представьте основную информацию о продукте, около 20 полей данных, большинство всего несколько слов. Индексируется только 1 столбец, остальные сохраняются. Я собираю данные из текстовых файлов, так что эта часть довольно быстрая.

Текущая скорость индексации составляет всего около 40 МБ в час. Я слышал, что другие люди говорят, что они достигли в 100 раз быстрее, чем это. Для небольших файлов (около 20 МБ) индексация идет довольно быстро (5 минут). Тем не менее, когда он у меня проходит по всем моим файлам данных (около 50 файлов общим объемом 10 ГБ), со временем рост индекса, похоже, сильно замедляется. Любые идеи о том, как я могу ускорить индексацию, или какова оптимальная скорость индексации?

Кстати, я заметил, что API в порту .Net, похоже, не содержит все те же методы, что и оригинал в Java ...

Обновление - вот фрагменты кода C # для индексирования: Сначала я все настроил:

            directory = FSDirectory.GetDirectory(@txtIndexFolder.Text, true);
            iwriter = new IndexWriter(directory, analyzer, true);
            iwriter.SetMaxFieldLength(25000);
            iwriter.SetMergeFactor(1000);
            iwriter.SetMaxBufferedDocs(Convert.ToInt16(txtBuffer.Text));

Затем прочитайте из файла данных с разделителями табуляции:

    using (System.IO.TextReader tr = System.IO.File.OpenText(File))
    {
        string line;
        while ((line = tr.ReadLine()) != null)
        {
            string[] items = line.Split('\t');

Затем создайте поля и добавьте документ в индекс:

                fldName = new Field("Name", items[4], Field.Store.YES, Field.Index.NO);
                doc.Add(fldName);
                fldUPC = new Field("UPC", items[10], Field.Store.YES, Field.Index.NO);
                doc.Add(fldUPC);
                string Contents = items[4] + " " + items[5] + " " + items[9] + " " + items[10] + " "  + items[11] + " " + items[23] + " " + items[24];
                fldContents = new Field("Contents", Contents, Field.Store.NO, Field.Index.TOKENIZED);
                doc.Add(fldContents);
                ...
                iwriter.AddDocument(doc);

После завершения индексации:

    iwriter.Optimize();
    iwriter.Close();

Ответы [ 2 ]

4 голосов
/ 10 октября 2010

По-видимому, я скачал 3-летнюю версию Lucene, с которой по какой-то причине явно связаны ссылки с домашней страницы проекта ... скачал самый последний исходный код Lucene, скомпилировал, использовал новую DLL, исправил все. Документация вроде отстой, но цена правильная и очень быстрая.

Из полезного блога

Перво-наперво, вы должны добавить библиотеки Lucene для вашего проекта. На веб-сайте Lucene.NET вы увидите самые последние версии сборки Lucene. Это два года. Do не хватайте их, у них есть ошибки. Там не было официального релиза Lucene в течение некоторого времени, вероятно, из-за к ресурсным ограничениям Сопровождающие. Используйте Subversion (или TortoiseSVN), чтобы просмотреть и захватить самый последний обновленный Lucene.NET код из хранилища Apache SVN. Решение и проекты визуальные Студия 2005 и .NET 2.0, но я обновил проекты до Visual Studio 2008 без проблем. Я мог построить решение без каких-либо ошибки. Перейдите в каталог bin, возьмите dll Lucene.Net и добавьте его в свой проект.

0 голосов
/ 04 января 2012

Поскольку я не могу комментировать отмеченный выше ответ, связанный с 3-летней версией, я настоятельно рекомендую установить расширение Visual Studio для диспетчера пакетов NuGet при добавлении Lucene.NET в ваши проекты. Следует добавить самую последнюю версию DLL для вас, если вам не нужна конкретная более поздняя версия.

...