Сортировать по дате в проблемах производительности Solr / Lucene

Мы создали индекс Solr, содержащий 36 миллионов документов (~ 1–2 КБ каждый), и мы пытаемся запросить максимум 100 документов, соответствующих одному простому ключевому слову. Это работает довольно быстро, как мы и надеялись. Однако, если мы теперь добавим к запросу «& sort = createDate + desc» (таким образом запрашивая 100 лучших «новых» документов, соответствующих запросу), он будет выполняться очень долго и, наконец, приведет к исключению OutOfMemoryException. Насколько я понял из руководства, это вызвано тем фактом, что Lucene необходимо загрузить все отдельные значения для этого поля (createDate) в память (FieldCache afaik), прежде чем он сможет выполнить запрос. Поскольку поле createDate содержит дату и время, количество различных значений довольно велико. Также важно отметить, что мы часто обновляем index.

Возможно, кто-то может дать некоторые идеи и указания о том, как мы можем настроить Lucene / Solr или изменить наш подход таким образом, чтобы время запроса стало приемлемым? Будем очень признательны за ваш вклад! Спасибо.


person schuilr    schedule 30.11.2009    source источник


Ответы (3)


Проблема в том, что Lucene хранит числа в виде строк. Есть несколько утилит, которые разбивают дату на ГГГГ, ММ, ДД и помещают их в разные поля. Это дает гораздо лучшие результаты.

Более новая версия Lucene (2.9 и выше) поддерживает числовые поля, и улучшения производительности значительны (пара порядков, IIRC). Проверьте эта статья о числовых запросах.

person Shashikant Kore    schedule 30.11.2009
comment
Спасибо за ваш вклад, Сашикант! Действительно, обновление до Solr 1.4 (которое реализует Lucene 2.9) имело большое значение. Основным преимуществом этого метода для нас является то, что он поддерживает FieldCache для каждого сегмента и не требует его перезагрузки после фиксации для сегментов, которые не изменились. - person schuilr; 30.11.2009

Вместо этого вы можете отсортировать результаты по порядку индекса. Спецификация сортировки по убыванию по номеру документа:

new SortField(null, SortField.DOC, true)

Вы также должны разделить каталоги индекса по полю даты. Все совпадающие документы проверяются Lucene при сборе первых N результатов. Разбиение разделит исследуемый набор. Вам не нужно проверять старые разделы, если у вас N результатов в самом новом разделе.

person Ivo Danihelka    schedule 26.01.2011

Попробуйте преобразовать данные типа Date в тип String (например, миллисекунды).

person viechang    schedule 13.09.2012