Возможно, это старый вопрос и много полезных ответов и рекомендаций, но я постараюсь обобщить результаты и описать решение для разбивки на большие массивы данных с использованием курсор , потому что. Я недавно столкнулся с этой проблемой.
Поскольку упоминается Йоник , проблема обычного start
/ rows
заключается в том, что когда у нас большой набор данных, а start
немного дальше ( много дальше ), чем ноль, мы имеем хорошие накладные расходы с точки зрения эффективности и памяти. Это происходит потому, что выборка 20 документов из "середины" 500K записей + с использованием сортировки, по крайней мере, требует сортировки всего набора данных ( сортировка внутренних уникальных ) , Более того, если поиск будет распространяться, он будет еще более ресурсоемким, т.к. набор данных ( из 500 020 строк ) из каждого сегмента должен быть возвращен на узел агрегатора для объединения, чтобы найти применимые 20 строк.
Solr не может вычислить, какой соответствующий документ является 999001-м результатом в отсортированном порядке, без предварительного определения того, какие первые 999000 соответствуют отсортированным результатам.
Решением здесь является использование Solr cursorMark
.
По первому запросу вы объявляете, что &cursorMark=*
. Это значит следующее:
Вы можете думать, что это аналогично start=0
как способ сказать Solr " начать с начала моих отсортированных результатов ", за исключением того, что он также сообщает Solr, что вы хотите использовать Курсор.
! Одно «предостережение» заключается в том, что ваши sort
предложения должны включать поле uniqueKey . Это может быть поле id
, если оно уникально.
Часть первого запроса будет выглядеть так:
?sort=price desc,id asc&start=0&cursorMark=* ...
В результате вы получите следующую структуру
{
"response":{"numFound":20,"start":0,"docs":[ /* docs here */ ]},
"nextCursorMark":"AoIIRPoAAFBX" // Here is cursor mark for next "page"
}
Чтобы получить следующую страницу, следующий запрос будет выглядеть следующим образом:
?sort=price desc,id asc&start=0&cursorMark=AoIIRPoAAFBX ...
Обратите внимание на cursorMark
из предыдущего ответа. И в результате вы получите следующую страницу результатов ( такая же структура, как и у первого ответа, но с другим nextCursorMarker
значением ). И так далее ...
Этот подход идеально подходит для нумерации страниц с бесконечной прокруткой, но для его использования в классической нумерации страниц есть несколько вещей, о которых стоит подумать:).
Вот некоторые справочные материалы, которые я нашел для решения этой проблемы, надеюсь, это поможет кому-то это сделать.