Как эффективно объединить два результата поиска? - PullRequest
3 голосов
/ 01 августа 2009

Я программирую сайт на PHP / MySQL, который получает результаты поиска продуктов через API с внешнего сайта. Этот сайт также будет иметь свои собственные продукты, и владельцы сайта хотят, чтобы результаты поиска были связаны между собой.

Если кто-то ищет ВИДЕО, упорядоченный по дате, то результаты должны быть в полном порядке, независимо от источника, из которого они получены.

например.

July 31 - Video A - our database
July 30 - Video B - via API
July 29 - Video C - via API
July 28 - Video D - our database
...

Проблема, с которой я столкнулся, заключается в том, чтобы найти способ сделать это эффективно, особенно в отношении просмотра нескольких страниц результатов. Если кто-то нажимает на 2-ю страницу результатов, то мне нужно выяснить последний элемент на первой странице результатов (и последний элемент из API), а затем получать элементы из API только после того, как последний элемент API был просмотрен в предыдущей странице, а затем сделайте то же самое для результатов нашей базы данных и снова объедините их.

Чтобы избежать этого сложного алгоритма, у меня была еще одна идея - ограничить результаты большим количеством, например, 500, собрать все сразу и упорядочить. Затем, если пользователь переходит на несколько страниц вперед, мне не нужно повторно захватывать все данные.

У кого-нибудь есть предложения по хорошим алгоритмам, которые можно использовать для объединения двух результатов поиска?

1 Ответ

3 голосов
/ 01 августа 2009

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

Получение большого количества результатов и их кэширование (в сеансе) - это единственное решение, которое вы можете использовать.

Если по какой-то причине вы не хотите кэшировать все результаты (если операция дорогостоящая и вам необходимо оптимизировать ее), вы можете сохранить в сеансе простой массив, содержащий местоположение результатов, и затем вы будет знать начальный номер для следующей страницы.

Например (псевдокод)

**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 дополнительных результатов). Это сделает первый запрос длиннее, но, возможно, сделает второй запрос намного быстрее.

Если пользователь переместится на несколько страниц вперед, вам потребуется получить наибольшее количество результатов, которые могли бы отображаться на предыдущих неизвестных страницах из каждого источника.

Если вы не слишком беспокоитесь о производительности из любого источника, я бы извлек до большого числа, как вы сказали, и временно кешировал все результаты. Как только будет выполнен новый поиск, сбросьте старые результаты.

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