我有一个包含超过100万条新闻的档案的新闻网站。 我创建了一个包含大约3000个条目的单词定义数据库,由单词定义对组成。
我想要做的是在新闻中每次出现这些词语的旁边添加一个定义。 我无法进行静态更改,因为我可以每天添加一个新关键字,因此我可以实时或缓存。
问题是,str_replace
或preg_replace
在文本中搜索3千个关键字并替换它们会非常慢。
有没有快速的选择?
答案 0 :(得分:1)
str_replace是非常活泼的,据我所知,你会发现最快的PHP。你当然应该保留缓存;这将绕过性能问题。
答案 1 :(得分:1)
str_replace不适用于您(除非您希望“superlative”中的“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)
答案 2 :(得分:0)
这只是一个加快流程,减少错误等的建议。