2010-04-14 60 views
0

我有一個新聞網站,其中包含一個包含超過100萬條新聞的檔案。 我創建了一個包含約3000個條目的單詞定義數據庫,由單詞定義對組成。用php和mysql替換文本中的關鍵字

我想要做的是在新聞中添加一個定義旁邊的每個這些單詞的發生。 我不能做一個靜態更改,因爲我可以每天添加一個新的關鍵字,所以我可以實時或緩存。

問題是,str_replacepreg_replace在搜索文本中的3千個關鍵字並替換它們時會很慢。

有沒有快速的選擇?

回答

1

str_replace函數不會爲你工作(除非你想在「最高級」,「perl的」是一個關鍵詞),你需要的東西,需要字邊界考慮(例如帶的preg_replace \b)。當然,你不能一次預置所有3000個關鍵字,但一個單獨的文檔幾乎不能包含所有的關鍵字,因此我建議對所有文檔進行預先索引,例如,通過維護一個索引表doc_id-> word_id。在提供特定文檔時,查詢索引並僅替換文檔實際包含的關鍵字(推測不超過100個)。

另一方面,如果文檔很短,維護索引表可能不值得麻煩。您可以簡單地進行預先編制索引,例如與strpos

$kw = array(); 
foreach($all_keywords as $k) if(strpos($text, $k)) $kw[] = $k; 

// $kw contains only words that actually occur in the text 
// (and perhaps some more, but that doesn't matter) 

preg_replace_callback('/\b(' . implode('|', $kw) . ')\b/', 'insert_keyword', $text) 
1

str_replace很漂亮,就我所知,它是你找到的最快的PHP。你當然應該保持一個緩存;這將繞過性能問題。

+0

我同意。如果您有一組定義的單詞,沒有理由使用preg_replace。 – kingjeffrey 2010-04-14 09:44:20

0

這只是一個建議,以加快這一進程,減少失誤等

  1. 創建一個函數,將一批新聞檔案。
  2. 創建一個函數來替換文本。 str_replace是我的賭注。
  3. 創建一個函數來產生php進程。請參考此thread
  4. 添加緩存功能。