-1

在我的网站上,有一个选项可以搜索已归档的文章。它工作正常,但我现在想做的是在结果预览的片段中突出显示匹配的单词(就像谷歌一样)。

$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)很多

4

2 回答 2

0

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

  1. 检查所有文章的关键字
  2. 在数据库中创建一个表,包含每个关键字和他们在其中描述的文档
  3. 对于每个给定的关键字,检查表,并从数据库中为用户提供结果

复杂性分为两个步骤:

  1. 数据库创建:O(n^2)
  2. 数据库查找:O(n)

这意味着数据库创建速度较慢,但​​查找速度更快。

可能很有用。

于 2012-11-05T19:36:12.077 回答
0

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

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

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

于 2012-11-05T21:02:10.920 回答