Lucene.net - Добавление документа к существующему индексу приводит к ошибкам поиска - PullRequest
1 голос
/ 17 июня 2019

Мы - группа студентов, которые используют Lucene.net для индексации нескольких 100 000 отпечатков музыки и сопоставления их с данными отпечатками из проанализированных песен, чтобы проверить, соответствуют ли они чему-либо, что есть в нашей базе данных.

Поскольку ежедневно выпускается большое количество новой музыки, мы стараемся обновлять наш индекс новыми данными, часто примерно на 5-8 000 отпечатков пальцев в неделю. Проблема возникает, когда мы добавляем несколько тысяч записей непосредственно в существующий индекс, так как это приводит к тому, что наш поиск сильно ухудшается или вообще не может быть найден. (Мы совершенно новички в индексации Lucene)

Чтобы это исправить, мы должны заново создать наш индекс, который является очень долгим процессом (до 18 часов). У меня вопрос, есть ли другие альтернативы, кроме воссоздания всего индекса? Мы рассмотрели возможность использования нескольких индексов и использования MultiReader, но похоже, что это только задерживает проблему?

Lucene.Net.Store.Directory directory = FSDirectory.Open (new System.IO.DirectoryInfo (luceneIndexPath));
IndexWriter iw = null;
int fingerCount = 0;
try {
    iw = new IndexWriter (directory, new StandardAnalyzer (Lucene.Net.Util.Version.LUCENE_30), false, IndexWriter.MaxFieldLength.UNLIMITED);
    iw.UseCompoundFile = false;
    iw.SetSimilarity (new CDR.Indexer.DefaultSimilarityExtended ());
    iw.MergeFactor = 10; // default = 10
    iw.SetRAMBufferSizeMB (512 * 3);

    Document doc = new Document ();
    doc.Add (new Field ("FINGERID", "", Field.Store.YES, Field.Index.NOT_ANALYZED));
    doc.Add (new Field ("SUBFINGER", "", Field.Store.NO, Field.Index.ANALYZED));
}

iw.AddDocument (doc);
iw.commit ();
iw.dispose ();

Большое спасибо за ваши соображения!

1 Ответ

0 голосов
/ 22 июня 2019

Я также новичок в lucene.net, но одна вещь, которую я заметил, заключается в том, что индексирование будет намного быстрее, если вы не очищаете или не фиксируете после каждого документа.Так что, если вы добавляете тысячи новых документов в индекс, позвольте lucene управлять, когда очищать его буферы памяти, и вызывать commit в вашем коде только после добавления всех документов.

Это означает, что вы не уверены, что новые документы будут сброшены на диск до тех пор, пока вы не вызовете commit (который неявно сбрасывает на диск), но скорость индексации будет намного выше, поскольку lucene не нужно создаватьновый сегмент индекса на диске для каждого документа, который затем необходимо объединить, но вместо этого он может выполнять эти первоначальные объединения в памяти для каждого нового документа до тех пор, пока ему не потребуется сбросить буфер памяти на диск, и в этом случае только один новый сегмент будет записан на диск для всей совокупностииз тех документов, которые были «включены», если хотите.Этот подход значительно сокращает количество операций ввода-вывода на диск для тысяч добавленных документов и, следовательно, увеличивает скорость.

...