2015-09-28 3 views
1

Я пытался подходить к асинхронной инициализации нашего индекса Lucene.Объединенные индексы Lucene .NET не дают таких же результатов, как непосредственно записанный индекс

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

Проблема в том, что когда задача полностью выполнена, наш индекс, похоже, не дает того же результата.

Теперь многие конкретные запросы дадут такое же количество результатов, например. contentType: notification

A Весь селектор документов также дает те же результаты. (:)

Но если я делаю поиск подстановки, например. 'c *' индекс, который был построен из фрагментированных индексов, а затем объединил доходность 0 результатов, но тот, который был написан за один большой ход, может дать несколько сотен тысяч результатов (ведьма справедлива, так как c * - довольно широкий поиск) ...

Есть ли что-то, что нужно сделать для объединенных индексов или есть некоторые различия в их обработке? ... Я попытался запустить Оптимизацию на них, но не повезло.

ответ

0

не зная подробностей ... Я бы сказал, что вы используете слишком большой молоток на этой гайки :)

Я работал с пакетными создали индексы (100 Миллионы Docs) и инкрементные индексы (100K + обновления в день на многих миллионах документов). Оба подхода использовали только один IndexWriter в одном каталоге индекса.

Трюк заключается в том, чтобы настроить IW MergePolicy соответствующим образом и/или настроить «задержку» поискового пользователя, только периодически обновляя IndexReader. Это существенно «кэширует» ИК в течение периода, который улучшает скорость поиска за счет небольшого устаревания. Настройте период, основанный на ожиданиях.

можно расширить на подходе, если это еще вопрос

+0

Я думаю, все это зависит от сложности документов, если у вас есть достаточно простые документы с несколькими полями может быть очень отличается от очень сложных документов. Все, что я знаю, это то, что для регистрации всех наших документов требуется более 1 часа. Мы поняли, что здесь есть узкое место для хранения, так как один и тот же набор можно сделать за 7 минут на 250 КБ IOPS - 2 ГБ/с. Таким образом, это может не помочь создавать индексы в памяти и объединять их в диск, но об этом можно было бы узнать только, протестировав его. Нет смысла тестировать производительность, но если она не работает. – Jens

+0

, если вы создаете индекс «навалом», а не непрерывные обновления, вы можете использовать SetRAMBufferSizeMB в IndexWriter для некоторого большого значения. Это приведет к буферизации документов в памяти перед тем, как погрузить на диск. Побочным эффектом является то, что сегменты намного больше, а слияние происходит гораздо реже. Я наблюдал улучшения порядка, поскольку количество дискового ввода-вывода резко сокращается. – AndyPook

+0

Настройка буфера ОЗУ фактически помогла только до тех пор, пока мы не нажмем флеш. Как оказалось, хотя именно SAN вызвало большинство наших проблем, и для индексации ~ 250 тыс. Документов (около 750 млн. Полей, по оценкам, средний объем полей для каждого документа составляет около 10 минут) ... Первоначальный вопрос по-прежнему меня интересует с теоретической точки зрения, но почему подход слияния, похоже, дает другой результат, однако я не мог воспроизвести проблему для более простой и необработанной реализации, поэтому исходный, хотя и что это должно быть в наших упаковках) – Jens