2009-10-30 122 views
0

我目前正在爲較小的網站構建一個小型CMS。現在我想提取text_content字段中的所有單詞,並將它們存儲在我的word表中供以後分析。從SQL中的文本字段中提取單詞

page(id int, 
     title varchar(45), 
     # ... a bunch of meta fields ... 
     html_content text, 
     text_content text); 

word(page_id int,  # Foreign key 
     word varchar(100)); # I presume there are no words longer than 100 chars 

目前我正在使用下面的代碼,對於較大的文本塊運行速度非常緩慢(可以理解)。

// Sidenote: $_POST is sanitized above scope of this code. 
$_POST['text_content'] = str_replace("\t", "", 
     htmlspecialchars_decode(strip_tags($_POST['html_content']))); 

// text is in swedish, so we add support for swedish vowels 
$words = str_word_count($_POST['text_content'], 1, "åäöÅÄÖ"); 

// Delete all previous records of words 
$this->db->delete("word", array('page_id' => $_POST['id'])); 

// Add current ones 
foreach($words as $word) 
{ 
    if (trim($word) == "") 
     continue; 

    $this->db->query("INSERT INTO word(page_id, word) VALUES(?, ?)", 
         array($_POST['id'], strtolower(trim($word)))); 
} 

現在,我不滿意這個解決方案。我正在考慮在數據庫中創建一個觸發器,它與php版本幾乎完全相同。 是否有可能在MySQL中創建觸發器來執行所述操作(如果有的話) - 如何?或者,還有更好的方法?我對此採取瘋狂的方法嗎?

回答

4

通過構建單個插入查詢並執行它,而不是爲每個單詞單獨查詢,您可以顯着加快此PHP代碼的速度。否則,我認爲你的代碼看起來不好。

+0

謝謝。我不知道你可以這樣做。現在執行45秒的時間現在在0.9秒內執行。這解決了我的問題:) – 2009-10-30 20:00:42

+0

絕對。從客戶端到服務器通信,每個查詢都有相當大的開銷。此外,blurb可以傳遞到一個存儲過程,將其分解並執行插入操作 – 2009-10-30 20:01:45

1

執行大型計算的觸發器會降低應用程序的運行速度。

我認爲你最好是安排一項任務來定期運行併爲你執行提取。

+0

我想這可以工作,但我不喜歡cron工作。 – 2009-10-30 18:06:30

0

您是否嘗試過使用PHP的「htmlentities」函數去除這些標籤?

+0

的事情是,我想刪除html標籤以產生純文本版本。 – 2009-10-30 18:04:45