2010-08-24 303 views
1

所有,搜索提供XML为关键词

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

该脚本每30分钟运行一次。麻烦的是,根据返回的故事数量,需要1-3分钟。不是'可怕的',但是在一个托管env的分片上,我可以看到这导致了很多问题,特别是随着网站的增长以及更多的feed /关键字的添加。

有什么方法可以优化关键字的“搜索”,以便我可以加快“索引”?

谢谢!

回答

2

35-40 RSS feeds是一个脚本处理和解析所有请求的很多请求。你的瓶颈很可能是请求,而不是解析。你应该分开担忧。有一个脚本每分钟一次请求一个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中循环并在那里汇总结果更有效)。 ..