假设我在一个包含2列的表中有一个包含100,000条MySQL记录的表:标题和描述。 还有一个表格,其中包含需要消毒的所有坏词。
例如让我们说标题栏包含字符串"操这个"亵渎表说"他妈的"字符串应替换为" F ***"。
目前我用暴力方法实现它,但这太慢了。它检查句子中的每个子字符串,并将其与亵渎性过滤器中存在的每个字符串进行比较。
public function sanitizeSiteProfanity($word, $replacement)
{
$query = $this->_ci->db->select('title, description')->get('top_sites')->result_array();
$n = $query->num_rows();
for($i = 0; $i < $n; $i++)
{
str_replace($word, $replacement, $query[$i]['title']);
str_replace($word, $replacement, $query[$i]['description']);
}
}
是否有更快的方法来消毒所有子串?
答案 0 :(得分:0)
优化这一点的最佳方法是将替换步骤委托给数据库,让mysql完成繁重的任务。您需要使用内置的REPLACE
mysql。 (不那么大)缺点是您需要使用显式sql而不是代码点火器表达式构建器。
答案 1 :(得分:0)
我不知道是否有快速清理数据的方法。似乎你必须遍历所有替换词,因为一个标题可能有多个令人反感的词。
如果您正在寻找完整的单词,全文索引和包含应该加快速度。基本上,您将为每个单词设置一个循环,然后运行:
update table
set title = replace(title, 'F***')
where match (title) against ('Fuck' in boolean mode);
您需要将它放在存储过程循环中。但是,match()
会非常快,这可能会显着加快当前流程。
答案 2 :(得分:0)
你试过BanBuilder吗?它保存在GitHub。