Независимо от того, используете ли вы его для кэширования или нет, вам нужно будет получить хотя бы страницу результатов из обоих источников на случай, если все следующие результаты будут получены из этого источника.
Получение большого количества результатов и их кэширование (в сеансе) - это единственное решение, которое вы можете использовать.
Если по какой-то причине вы не хотите кэшировать все результаты (если операция дорогостоящая и вам необходимо оптимизировать ее), вы можете сохранить в сеансе простой массив, содержащий местоположение результатов, и затем вы будет знать начальный номер для следующей страницы.
Например (псевдокод)
**Request 1**
Get 10 results from API
Get 10 results form Database
Merge the results
Display first 10 and save the order to an array
(A for API, D for Database, ex: A,A,A,D,A,D,D,A,D,A)
User clicks page 2
**Request 2** (Page 2)
Get 10 results from API starting at 5
Get 10 results from Database starting at 7
Repeat merge and display above.
Вы также можете при желании кэшировать то, что вам нужно для извлечения (и у вас будет 10 дополнительных результатов). Это сделает первый запрос длиннее, но, возможно, сделает второй запрос намного быстрее.
Если пользователь переместится на несколько страниц вперед, вам потребуется получить наибольшее количество результатов, которые могли бы отображаться на предыдущих неизвестных страницах из каждого источника.
Если вы не слишком беспокоитесь о производительности из любого источника, я бы извлек до большого числа, как вы сказали, и временно кешировал все результаты. Как только будет выполнен новый поиск, сбросьте старые результаты.