2011-09-29 20 views
0

作爲CMS管理員的一部分,我想掃描存儲在mysql數據庫中的特定關鍵字/標籤的新文章。php掃描特定關鍵字的內容

我很熟練,能夠拉出關鍵字列表,循環遍歷它們並做stripos,substr_count構建找到的關鍵字數組。但平均文章大約700字,並且有16,000個標籤,並且正在增長,所以目前該循環大約需要0.5s,這比我所希望的要長,並且只會變得更長。

有沒有更好的方法來做到這一點?即使這種程序有一個特殊的名稱,這可能會有所幫助。

我在Fedora上有PHP 5.3,它也在專用服務器上,所以我沒有任何共享主機問題。

編輯 - 我是這樣一個scattrbrain,我發誓盲目複製粘貼一些代碼!顯然不是

$found = array(); 
while($row = $pointer->fetch_assoc()) 
{ 
    if(stripos($haystack, $row["Name"])) 
    { 
     $found[$row["Name"]] = substr_count($haystack, $row["Name"]); 
    } 
} 
arsort($found); 

我想我解釋我自己不好,因爲我想要做的他們目前沒有在數據庫上新文章的程序,所以我只是要在一個Ajax請求使用$ _ POST,而不是首先將文章保存到數據庫。

+0

全文搜索和/或sphinxsearch – Jauzsika

+0

道歉我沒有在那裏看到你!看到下面的評論:) – CodeMonkey

回答

0

http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html正是如果您不想使用搜索引擎腳本(如sphinx/solr),您正在尋找。

+0

道歉我沒有足夠清楚,請參閱編輯,因爲文章只是在內存/ $ _ POST我只運行一個數據庫查詢來獲取關鍵字,每個關鍵字的一個查詢搜索肯定會更慢,甚至我批量他們有沒有比在內存中比較更快的機會? – CodeMonkey

+0

我不反對獅身人面像,只是不太瞭解它 - 但 - 這將是保存文章的情況下,觸發獅身人面像重新索引,然後發送一堆多重查詢? – CodeMonkey

+0

@CodeMonkey:爲此,我建議你參考他們的wiki:http://sphinxsearch.com/wiki/doku.php,希望它有幫助;) – Kenny

0

這聽起來像你的代碼看起來是這樣的:

foreach($keywords as $keyword){ 
    if(strpos($keyword, $articleText) != -1){ 
     $foundKeywords[] = $keyword; 
    } 
} 

有些事情,你可以考慮,因爲關鍵字陣列是如此之大,並會繼續增長是通過文字的話你處理切換到循環而不是關鍵字數組。就像這樣:

$textWords = explode(" ", $articleText); 

foreach($textWords as $word){ 
    if(array_search($word, $keywords) && !array_search($word, $foundKeywords)){ 
     $foundKeywords[] = $word; 
    } 
} 
+1

或多或少 - 但你可能想使用單詞/非單詞的邊界用於拆分而不是空格(請參見PCRE),爲什麼不把它壓縮到數據庫層並在您使用時實施搜索引擎? – symcbean

+0

請注意,在您的代碼中,如果沒有出現且不是-1,則strpos返回布爾值false。 – Fredrik

+0

令人遺憾的是,這種方法並沒有幫助,我測試了它,它實際上花了近兩倍的時間,同樣我認爲我沒有很好地解釋我的原始文章,但一些標籤是關鍵詞,所以不止一個詞意味着分裂通過單詞的分歧忽略了很多 – CodeMonkey