如何有效地结合两个搜索结果?

时间:2009-07-31 23:21:23

标签: database algorithm search

我正在编写一个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
...

我遇到的问题是找到一种有效地做到这一点的方法,尤其是在查看多页结果时。如果有人点击结果的第二页,那么我需要弄清楚结果的第一页上的最后一项(以及API中的最后一项),然后只能在查看最后一个API项目后的API中获取项目上一页然后对我们的数据库结果执行相同操作并再次重新组合它们。

为了避免这种复杂的算法,我的另一个想法是将结果限制在很大的数量 - 比如500个结果并立即抓住它们并订购它们。然后,如果用户前进几页,我不必重新获取所有数据。

是否有人建议使用好的算法来合并两个搜索结果?

1 个答案:

答案 0 :(得分:3)

无论您是否使用它进行缓存,您都需要从这两个来源获取至少一页的结果,以防所有下一个结果都来自该来源。

抓取大量结果并缓存它们(在会话中)是您可以使用的一种解决方案。

如果由于某种原因你不想缓存所有结果(如果操作很昂贵并且你需要优化),你可以在会话中存储一个包含结果位置的简单数组,然后你会知道下一页的起始编号。

例如(伪代码)

**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个额外的结果)。这会使第一个请求更长,但可能会使第二个请求更快。

如果用户跳过多个页面,您需要获得可能在每个来源的前面未知页面中显示的最大数量的结果。

如果您不太担心来自任何一个来源的性能,我会像您所说的那样检索大量数据并暂时缓存所有结果。执行新搜索后,请转储旧结果。