【问题标题】:Searching XML Feeds for Keywords在 XML 源中搜索关键字
【发布时间】:2011-04-03 04:29:40
【问题描述】:

全部,

我正在构建一个网站,它将从大约 35 个不同的 RSS 提要中收集新闻故事,并将其存储在一个数组中。我正在使用 foreach() 循环来搜索标题和描述,以查看它是否包含大约 40 个关键字之一,对每篇文章使用 substr()。如果搜索成功,该文章将存储在数据库中,最终将出现在网站上。

脚本每 30 分钟运行一次。麻烦的是,这需要 1-3 分钟,具体取决于返回的故事数。并不“糟糕”,但在分片托管环境中,我可以看到这会导致很多问题,尤其是随着网站的增长和添加更多的提要/关键字。

有什么方法可以优化关键字的“搜索”,从而加快“索引”的速度?

谢谢!!

【问题讨论】:

    标签: php xml keyword


    【解决方案1】:

    35-40 RSS 提要是一个脚本一次处理和解析所有请求的大量请求。您的瓶颈很可能是请求,而不是解析。您应该将关注点分开。拥有一个脚本,每分钟左右一次请求一个 RSS 提要,并将结果存储在本地。然后另一个脚本应该每 15-30 分钟解析和保存/删除临时结果。

    【讨论】:

      【解决方案2】:

      您可以使用XPath 直接搜索 XML...类似:

      $dom = new DomDocument();
      $dom->loadXml($feedXml);
      $xpath = new DomXpath($dom);
      
      $query = '//item[contains(title, "foo")] | //item[contains(description, "foo")]';
      $matchingNodes = $xpath->query($query);
      

      然后,$matchingNodes 将是所有匹配的 item 节点中的 DomNodeList。然后你可以将它们保存在数据库中......

      因此,要将其调整为您的真实示例,您可以构建查询以一次性完成所有搜索:

      $query = array();
      foreach($keywords as $keyword) {
          $query[] = '//item[contains(title, "'.$keyword.'")]';
          $query[] = '//item[contains(description, "'.$keyword.'")]';
      }
      $query = implode('|', $query);
      

      或者只是重新查询每个关键字...就我个人而言,我会构建一个巨大的查询,因为那时所有的匹配都是在编译好的 C 代码中完成的(因此应该比在 php 领域循环和聚合结果在那里)...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-11
        • 2018-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多