【问题标题】:How to design a database schema for a search engine?如何为搜索引擎设计数据库模式?
【发布时间】:2011-03-27 05:37:32
【问题描述】:

我正在用 C 语言编写一个带有 curl、libxml2 和 mysql 的小型搜索引擎。基本计划是用 curl 抓取页面,用 libxml2 解析它们,然后遍历 DOM 并找到所有链接。然后遍历其中的每一个并重复,同时更新维护 URL 之间关系的 SQL 数据库。

我的问题是:如何才能最好地表示 URL 之间的关系?

【问题讨论】:

  • 您重新发明搜索引擎有什么特别的原因吗?有许多强大的解决方案。

标签: database search


【解决方案1】:

为什么没有一个基本 url 表(即 www.google.com/)和一个连接表,以及这些示例列:

  • 起始页 ID(来自 url 表)
  • 结束页面 ID(来自 url 表)
  • 网址的尾随目录作为另外两列中的字符串

这将允许您加入某些网址并挑选您想要的信息。

您的解决方案似乎更适合非关系数据存储,例如列存储。

大多数搜索引擎索引不存储在关系数据库中,而是存储在内存中以尽量减少检索时间。

【讨论】:

  • 我认为 Memcached 不太适合您的问题。它不是持久的。也许像redis
【解决方案2】:

向表中添加两个字段 - 'id' 和 'parent_id'。

id - URL 的唯一标识符 parent_id - URL 之间的链接

【讨论】:

    【解决方案3】:

    如果您希望每个 URL 有一个条目,那么您应该创建另一个映射关系的表。

    然后您查找 URL 表以查看它是否存在。如果不创建它。

    关系表会有

    SourceUrlId,
    UrlId
    

    SourceUrlId 是页面,UrlId 是它指向的 url。这样,您可以为同一个 URL 建立多个关系,并且您不需要在 Url 表中为指向该 URL 的每个链接创建一个新条目。也意味着您存储的任何其他信息仅一份副本。

    【讨论】:

      【解决方案4】:

      您为什么对表示页面图表感兴趣?

      如果您想计算排名,那么最好使用更简洁有效的表示(例如,如果您想计算类似于 PageRank 的东西,则使用矩阵形式)。

      【讨论】:

      • 也许吧,但 SE 应该处理大量、巨大、巨大、大量的数据,因此简洁性和效率应该是重中之重。我的意思是:使用 SQL(尤其是 mysql)看起来是个糟糕的主意。
      猜你喜欢
      • 1970-01-01
      • 2017-07-23
      • 2015-06-05
      • 2019-09-19
      • 2011-06-06
      • 1970-01-01
      • 1970-01-01
      • 2012-09-07
      • 2015-05-02
      相关资源
      最近更新 更多