Я занимаюсь поиском нашего сайта, к которому обращаются тысячи пользователей. Я люблю CloudSearch, так как он очень быстрый и снимает нагрузку с моего RDS. У нас есть около 30 тыс. Документов, поэтому для разбивки результатов по страницам мне понадобятся курсоры. Документы постоянно обновляются (добавляются, изменяются или удаляются). Эта проблема у меня сейчас, чтобы получить предыдущий курсор.
Моя идеальная ситуация была бы
{} Пред {…} {3} {4} {5} {6} {7} {…} {Следующий}
Но я заметил, что это очень трудно сделать, потому что я не могу получить все курсоры каждый раз, когда выполняется запрос. Так что я думаю просто делать
{} Пред {Следующий}
Как я это делаю, передавая текущий курсор & следующий курсор к AJAX-скрипту для загрузки новых результатов. Это прекрасно работает, когда пользователь просто движется вперед и получает следующую страницу. Он ломается, когда пользователь возвращается и возвращает предыдущую страницу. Они могут вернуться на одну страницу к текущему (предыдущему) курсору, но они не могут вернуться назад более чем на 1 страницу. Что смешно с точки зрения пользователей.
Я попытался сохранить курсоры, но это снова сломается, если появятся новые документы или будут удалены старые документы. Мой курсор вернет 0 результатов. Если бы я брал новые курсоры, я видел бы только следующий, а не предыдущий.
Пример:
Страница 2 имеет курсор ????
Страница 3 есть курсор ????
Страница 4 (текущая страница) имеет курсор VWXabc123
Страница 5 (следующая страница) имеет курсор VUTdef456
Итак, вопрос в том, как мне получить предыдущие курсоры перед страницей 4? Я не могу сохранить результаты или получить их из запроса, что означает, что я даже не могу сделать простые кнопки «Предыдущая» и «Далее».
Спасибо всем большое за это!
Вы можете использовать параметры ‘start’ и ‘size’ вместо ‘cursor’: это позволяет вам произвольно читать результаты. Но CloudSearch ограничивает вас до 10 000 результатов во всем наборе.
Чтобы позволить клиенту бесконечно «возвращаться» с помощью курсоров, вам необходимо отслеживать их. Если у вас есть только один сервер приложений, с которым они общаются и отслеживают сеансы клиентов, вы можете сохранить их на своем сервере приложений, сопоставив их с prev / next и / или page = #.
Наше приложение имеет несколько серверов EC2, поэтому мы не можем отслеживать там. Но мы можем заставить клиента хранить «стопку» курсоров, на которых они работали, когда они перемещаются по страницам, которые предоставляет каждый курсор. Когда они вернутся назад, уберите старый курсор со стека и перейдите туда. Когда они пойдут вперед, добавьте новый курсор в стек. Мы сделаем это в коде Angular нашего клиента.
Других решений пока нет …