我有一个新闻网站,其中包含超过 100 万条新闻的档案。我创建了一个包含约 3000 个条目的词定义数据库,由词定义对组成。
我想做的是在新闻中每次出现这些词的旁边添加一个定义。我无法进行静态更改,因为我可以每天添加一个新关键字,因此我可以使其成为实时或缓存。
问题是,astr_replace
或 apreg_replace
在文本中搜索 3000 个关键字并替换它们会非常慢。
有没有快速的替代品?
我有一个新闻网站,其中包含超过 100 万条新闻的档案。我创建了一个包含约 3000 个条目的词定义数据库,由词定义对组成。
我想做的是在新闻中每次出现这些词的旁边添加一个定义。我无法进行静态更改,因为我可以每天添加一个新关键字,因此我可以使其成为实时或缓存。
问题是,astr_replace
或 apreg_replace
在文本中搜索 3000 个关键字并替换它们会非常慢。
有没有快速的替代品?
str_replace 非常活泼,据我所知,它是 PHP 中最快的。您当然应该保留缓存;这将绕过性能问题。
str_replace 对您不起作用(除非您希望“最高级”中的“perl”成为关键字),您需要考虑单词边界的东西(例如 preg_replace with \b
)。当然,你不能一次preg_replace所有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)
这只是加快流程,减少错误等的建议。