【问题标题】:php scanning content for specific keywordsphp扫描特定关键字的内容
【发布时间】:2011-09-29 15:25:19
【问题描述】:

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

我足够熟练,能够提取关键字列表,循环遍历它们并执行 stripos,并使用 substr_count 构建找到的关键字数组。但是平均文章大约 700 字,并且有 16,000 个标签并且还在增长,所以目前循环需要大约 0.5 秒,这比我希望的要长,而且只会越来越长。

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

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

编辑 - 我是个杂乱无章的人,我发誓我复制并粘贴了一些代码!显然不是

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

我想我解释得很糟糕,因为我想对它们当前不在数据库中的新文章执行该过程,所以我只是打算在 ajax 请求中使用 $_POST,而不是将文章保存到数据库首先。

【问题讨论】:

  • 全文搜索和/或 sphinxsearch
  • 抱歉,我没有看到你!请参阅下面的 cmets :)

标签: php search tags keyword


【解决方案1】:
如果您不想使用 sphinx/solr 等搜索引擎脚本,

http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html 正是您正在寻找的。​​p>

【讨论】:

  • 道歉我不够清楚,请参阅编辑,并且由于文章只是在内存中/$_POST 我只运行一个数据库查询来获取关键字,每个关键字的一个查询搜索肯定会更慢,即使我批量处理它们是否有可能比在内存中比较更快?
  • 我并不反对 sphinx,只是不太了解它——但是——这会是保存文章、触发 sphinx 重新索引然后向其发送一堆多查询的情况吗? ?
  • @CodeMonkey:为此,我建议您查阅他们的 wiki:sphinxsearch.com/wiki/doku.php,希望对您有所帮助;)
【解决方案2】:

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

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;
    } 
}

【讨论】:

  • 或多或少 - 但您可能希望使用单词/非单词边界来分割而不是空格(请参阅 PCRE),为什么不将其下推到数据库层并在您执行搜索引擎时来了吗?
  • 请注意您的代码中 strpos 如果没有出现而不是 -1 则返回布尔值 false。
  • 遗憾的是该方法没有帮助,我测试了它实际上花费了将近两倍的时间,而且我认为我在原始帖子中没有很好地解释,但是有些标签是关键词,所以不止一个词,这意味着按断词分割会漏掉很多词
猜你喜欢
  • 1970-01-01
  • 2015-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-03
  • 2023-04-05
  • 1970-01-01
相关资源
最近更新 更多