Сортировать по дате в Solr / Lucene проблем с производительностью - PullRequest
3 голосов
/ 30 ноября 2009

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

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

Ответы [ 3 ]

2 голосов
/ 30 ноября 2009

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

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

0 голосов
/ 13 сентября 2012

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

0 голосов
/ 26 января 2011

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

new SortField(null, SortField.DOC, true)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...