关键字匹配优化

时间:2012-11-05 19:13:49

标签: php optimization pattern-matching

在我的网站上,您可以选择搜索已归档的文章。它工作正常,但我现在要做的是突出显示结果预览的片段中的匹配单词(如Google所做的那样)。

$keywords = explode( $query );

$keywords中,我存储了搜索查询的关键字。然后,在准备要显示的每个结果时,我会执行以下操作:

$exploded  = explode( ' ', $text );
$count     = count( $exploded );
$text      = ''; // clears the text

for ( $i = 0; $i < $count; $i++ ) {
    if ( preg_grep( "/{$exploded[$i]}/i", $keywords ) ) {
        $exploded[$i] = '<strong>' . $exploded[$i] . '</strong>';
    }

    $text .= $exploded[$i] . ' ';
}

其中$text是当前结果的预览代码段的文本。所以基本上,如果一个单词匹配(不区分大小写),它会被strong element包围。

我的问题是:有没有办法进一步优化?因为这个脚本O(n^2)(因为for循环中的preg_grep调用)是针对每个结果执行的,所以这将构成整个脚本O(n^3)。在实际情况中,O(n^3) 很多

2 个答案:

答案 0 :(得分:0)

通常,搜索引擎会使用索引来实现这一目标。

  1. 检查所有文章中的关键字
  2. 在数据库中创建一个表,其中包含每个关键字及其在
  3. 中描述的文档
  4. 对于每个给定的关键字,请检查表格,并为数据库中的用户提供结果
  5. 复杂性分为两步:

    1. 数据库创建:O(n ^ 2)
    2. 数据库查找:O(n)
    3. 这意味着数据库创建速度慢,但查找速度更快。

      This可能有用。

答案 1 :(得分:0)

你可以做的一个简单的修改(它仍然相当慢,但应该快得多)是使用preg_replace代替。这是一个例子:

$pattern = '/(' . implode('|', explode( $query )) . ')/i';
$replacement = '<strong>${1}</strong>';
echo preg_replace($pattern, $replacement, $text);

这会将$query中的所有字词包装在$ text中的强标签中。