Сортировать по дате в Solr / Lucene проблем с производительностью
Вопрос
Мы создали индекс Solr, содержащий 36 миллионов документов (~ 1K-2K каждый), и мы пытаемся запросить максимум 100 документов, соответствующих одному простому ключевому слову. Это работает довольно быстро, как мы и надеялись. Однако, если мы теперь добавим & amp; sort = createDate + desc " к запросу (таким образом, запрашивая первые 100 «новых» документов, соответствующих запросу), он выполняется очень долго и, наконец, приводит к исключению OutOfMemoryException. Из того, что я понял из руководства, это связано с тем, что Lucene необходимо загрузить все отдельные значения для этого поля (createDate) в память (FieldCache afaik), прежде чем он сможет выполнить запрос. Поскольку поле createDate содержит дату и время, количество различных значений довольно велико. Также важно упомянуть, что мы часто обновляем индекс.
Возможно, кто-то может дать некоторые идеи и указания о том, как мы можем настроить Lucene / Solr или изменить наш подход таким образом, чтобы время запросов стало приемлемым? Ваш вклад будет высоко ценится! Спасибо.
Решение
Проблема в том, что Lucene хранит числа в виде строк. Есть несколько утилит, которые разбивают дату на YYYY, MM, DD и помещают их в разные поля. Это дает гораздо лучшие результаты.
Более новая версия Lucene (начиная с версии 2.9) поддерживает числовые поля, и улучшения производительности значительны (несколько порядков, IIRC.) Проверьте эта статья о числовых запросах.
Другие советы
Вместо этого вы можете отсортировать результаты по порядку индекса . Спецификация сортировки по убыванию по номеру документа:
new SortField(null, SortField.DOC, true)
Вы также должны разбить каталоги по полям даты. Все соответствующие документы проверяются Lucene при сборе N лучших результатов. Разбиение разделит рассмотренный набор. Вам не нужно проверять старые разделы, если у вас есть N результатов в самом новом разделе.
Попробуйте преобразовать данные типа Date в тип String (например, в миллисекундах).