2010-08-24 559 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中循環並在那裏彙總結果更有效)。 ..