在我的网站上,您可以选择搜索已归档的文章。它工作正常,但我现在要做的是突出显示结果预览的片段中的匹配单词(如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)
很多。
答案 0 :(得分:0)
通常,搜索引擎会使用索引来实现这一目标。
复杂性分为两步:
这意味着数据库创建速度慢,但查找速度更快。
This可能有用。
答案 1 :(得分:0)
你可以做的一个简单的修改(它仍然相当慢,但应该快得多)是使用preg_replace
代替。这是一个例子:
$pattern = '/(' . implode('|', explode( $query )) . ')/i';
$replacement = '<strong>${1}</strong>';
echo preg_replace($pattern, $replacement, $text);
这会将$query
中的所有字词包装在$ text中的强标签中。