【问题标题】:How to combine two search results effectively?如何有效地组合两个搜索结果?
【发布时间】:2009-07-31 23:21:23
【问题描述】:

我正在用 PHP/MySQL 编写一个网站,该网站通过 API 从外部网站获取产品搜索结果。该站点也将拥有自己的产品,并且该站点的所有者希望搜索结果能够相互连接。

如果有人搜索 VIDEO,按日期排序,那么无论其来源如何,结果都应该是有序的。

例如。

7 月 31 日 - 视频 A - 我们的数据库
7 月 30 日 - 视频 B - 通过 API
7 月 29 日 - 视频 C - 通过 API
7 月 28 日 - 视频 D - 我们的数据库
...

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

为了避免这种复杂的算法,我的另一个想法是将结果限制为大量 - 例如 500 个结果,并一次获取所有结果并排序。那么如果用户前进几页,我就不用重新抓取所有数据了。

有没有人对用于合并两个搜索结果的好算法提出建议?

【问题讨论】:

    标签: database algorithm search


    【解决方案1】:

    无论您是否将其用于缓存,您都需要从两个来源中获取至少一页的结果,以防所有下一个结果都来自该来源。

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

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

    例如(伪代码)

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

    如果用户向前跳转了几个页面,您将需要从每个来源获得最大数量的结果,这些结果可以显示在前面的未知页面中。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-11
      • 1970-01-01
      • 2014-09-28
      • 1970-01-01
      • 2010-09-24
      • 1970-01-01
      • 2012-05-06
      • 2012-03-25
      相关资源
      最近更新 更多