2011-09-29 56 views
0

作为CMS管理员的一部分,我想扫描存储在mysql数据库中的特定关键字/标签的新文章。php扫描特定关键字的内容

我很熟练,能够拉出关键字列表,循环遍历它们并做stripos,substr_count构建找到的关键字数组。但平均文章大约700字,并且有16,000个标签,并且正在增长,所以目前该循环大约需要0.5s,这比我所希望的要长,并且只会变得更长。

有没有更好的方法来做到这一点?即使这种程序有一个特殊的名称,这可能会有所帮助。

我在Fedora上有PHP 5.3,它也在专用服务器上,所以我没有任何共享主机问题。

编辑 - 我是这样一个scattrbrain,我发誓盲目复制粘贴一些代码!显然不是

$found = array(); 
while($row = $pointer->fetch_assoc()) 
{ 
    if(stripos($haystack, $row["Name"])) 
    { 
     $found[$row["Name"]] = substr_count($haystack, $row["Name"]); 
    } 
} 
arsort($found); 

我想我解释我自己不好,因为我想要做的他们目前没有在数据库上新文章的程序,所以我只是要在一个Ajax请求使用$ _ POST,而不是首先将文章保存到数据库。

+0

全文搜索和/或sphinxsearch – Jauzsika

+0

道歉我没有在那里看到你!看到下面的评论:) – CodeMonkey

回答

0

http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html正是如果您不想使用搜索引擎脚本(如sphinx/solr),您正在寻找。

+0

道歉我没有足够清楚,请参阅编辑,因为文章只是在内存/ $ _ POST我只运行一个数据库查询来获取关键字,每个关键字的一个查询搜索肯定会更慢,甚至我批量他们有没有比在内存中比较更快的机会? – CodeMonkey

+0

我不反对狮身人面像,只是不太了解它 - 但 - 这将是保存文章的情况下,触发狮身人面像重新索引,然后发送一堆多重查询? – CodeMonkey

+0

@CodeMonkey:为此,我建议你参考他们的wiki:http://sphinxsearch.com/wiki/doku.php,希望它有帮助;) – Kenny

0

这听起来像你的代码看起来是这样的:

foreach($keywords as $keyword){ 
    if(strpos($keyword, $articleText) != -1){ 
     $foundKeywords[] = $keyword; 
    } 
} 

有些事情,你可以考虑,因为关键字阵列是如此之大,并会继续增长是通过文字的话你处理切换到循环而不是关键字数组。就像这样:

$textWords = explode(" ", $articleText); 

foreach($textWords as $word){ 
    if(array_search($word, $keywords) && !array_search($word, $foundKeywords)){ 
     $foundKeywords[] = $word; 
    } 
} 
+1

或多或少 - 但你可能想使用单词/非单词的边界用于拆分而不是空格(请参见PCRE),为什么不把它压缩到数据库层并在您使用时实施搜索引擎? – symcbean

+0

请注意,在您的代码中,如果没有出现且不是-1,则strpos返回布尔值false。 – Fredrik

+0

令人遗憾的是,这种方法并没有帮助,我测试了它,它实际上花了近两倍的时间,同样我认为我没有很好地解释我的原始文章,但一些标签是关键词,所以不止一个词意味着分裂通过单词的分歧忽略了很多 – CodeMonkey