Лучше иметь более мелкие записи или меньше больших записей в Lucene? - PullRequest
1 голос
/ 23 февраля 2012

Я в процессе индексации огромного набора файлов журнала для приложения, над которым я работаю с использованием Lucene.net. Сейчас я анализирую свои файлы журналов для каждой записи (то есть запись может занимать несколько строк до следующей записи журнала) и добавляю каждую запись журнала в качестве документа в Lucene.

Каждый документ содержит запись в журнале (которая анализируется) и имеет некоторые другие поля (которые только что сохранены), такие как время строки журнала, номер строки журнала и из какого журнала он получен. Я также даю подсказку для каждого документа записи журнала, чтобы сопоставить последовательность записей журнала с исходным документом, и я могу изменить их порядок по номеру строки.

Хотя мне нравится гранулярность возможности поиска по каждой строке в моем индексе (и я могу перестроить исходный документ, используя указатель, назначенный каждому файлу журнала), мне любопытно, если этот вид индекса творение будет устойчивым. На самом деле, у меня уже есть что-то вроде 25 миллионов записей, которые представляют журналы всего за один год. Моя скорость поиска все еще довольно высока, я могу искать эти 25 миллионов записей примерно за секунду или две.

Лучше иметь меньше документов, но каждый документ больше? Это имеет значение? Буду ли я сталкиваться с узкими местами производительности с Lucene, когда у меня будет 50 миллионов записей? 100 миллионов? 500 миллионов? Если бы я индексировал только один файл журнала, у меня, вероятно, было бы на 3 порядка меньше документов, если бы я оценил, что каждый файл журнала имеет около 1000-20000 строк.

Ответы [ 2 ]

3 голосов
/ 23 февраля 2012

Советы по всем этим вопросам: производительность почти наверняка не станет вашей главной проблемой.Если требуемая функциональность лучше всего работает с документом на строку, то сделайте это следующим образом.

При этом словарь терминов Lucene выглядит примерно так:

term1 -> doc1 doc4 doc32 ...
term2 -> doc1 doc3 doc8

Таким образом, увеличение количества документов увеличитразмер индекса.

Прежде чем сделать вывод, что это плохо сказывается на производительности, спросите, как вам удастся вернуть каждую строку в качестве собственного результата поиска, если индексировать весь файл как один документ.Вам нужно будет выполнить дополнительный поиск в результатах поиска, который почти гарантированно будет медленнее, чем Lucene.Так что просто позвольте Lucene справиться с этим.

Что касается вашего вопроса о том, как высоко Lucene может масштабироваться: патч был отправлен несколько лет назад, потому что 32-битные идентификаторы, используемые Lucene, слишком малы.Таким образом, есть люди с индексами, содержащими более 2 ^ 32 = 4,2 миллиарда документов.

1 голос
/ 24 февраля 2012

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

См. в этой теме , где приведены некоторые действительные числа, например:

  • 100 индексов с одним свойством каждый: 00: 05: 08
  • 1 Индекс с 100 свойствами: 00: 02: 01

Это для 25 600 документов (каждый из которых имеет 100 свойств строки, заполненных направляющими). ​​

Примечание эти цифры относятся к RavenDB, но в нем широко используется Lucene, поэтому я был бы удивлен, если бы была большая разница при непосредственном использовании Lucene

...