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

StackOverflow https://stackoverflow.com/questions/1819168

  •  10-07-2019
  •  | 
  •  

Вопрос

Мы создали индекс 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 (например, в миллисекундах).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top