我目前正在为较小的网站构建一个小型CMS。现在,我想从text_content
字段中提取所有单词,并将它们存储在我的word
表中,以供日后分析。
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中创建一个执行所述操作的触发器,如果是这样 - 如何?或者,还有更好的方法?我对此采取疯狂态度吗?
答案 0 :(得分:4)
通过构建单个插入查询并执行它来代替每个单词的单独查询,可以显着加快此PHP代码的速度。否则,我不认为你的代码看起来那么糟糕。
答案 1 :(得分:1)
执行大型计算的触发器会降低应用程序的速度。
我认为您最好安排定期运行任务并为您执行提取。
答案 2 :(得分:0)
您是否尝试过PHP的“htmlentities”功能来剥离这些标签?