-1

私のウェブサイトには、アーカイブされた記事を検索するオプションがあります。それはうまく機能しますが、私が今やりたいのは、結果プレビューのスニペットで一致する単語を強調表示することです(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現在の結果のプレビュースニペットのテキストはどこにありますか。したがって、基本的に、単語が一致する場合(大文字と小文字は区別されません)、強い要素に囲まれます。

私の質問は:これをさらに最適化する方法はありますか?このスクリプトはO(n^2)(forループ内でpreg_grepが呼び出されるため)、結果ごとに実行されるため、スクリプト全体が作成されますO(n^3)。そして、実際の状況でO(n^3)たくさんあります。

4

2 に答える 2

0

実行できる簡単な変更の 1 つ (これはまだかなり遅いですが、はるかに高速になるはずです) は、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 に答える
0

通常、検索エンジンはインデックスを使用してこの目標を達成します。

  1. すべての記事のキーワードを確認する
  2. データベースにテーブルを作成し、各キーワードとそれらが説明したドキュメントを含む
  3. 指定されたキーワードごとに、テーブルを確認し、データベースからユーザーの結果を提供します

複雑さは次の 2 つのステップになります。

  1. データベースの作成: O(n^2)
  2. データベース検索: O(n)

つまり、データベースの作成は遅くなりますが、ルックアップは高速になります。

これは役に立つかもしれません。

于 2012-11-05T19:36:12.077 に答える