1

私が最近考えていることの 1 つは、imdb や github などのサイトで、検索バーに入力するだけで高速に検索候補を表示するにはどうすればよいかということです。私が見つけたほとんどのjQueryプラグインは、データセットをページにダンプしてから、そこで遊んでいます。しかし、これはページの重量が膨大になるため、データベースの大規模なセットでは機能しません。私の最初のアイデアはおそらく同期 ajax 呼び出しでしたが、これは実行が完了するまでフリーズを引き起こす可能性があると言われました。

質問: フォームへの入力中に大規模なデータ セットから同様のレコードを取得し、結果を表示する方法。

4

3 に答える 3

2

私は最近、FAQのためにこのようなものを作成しました。あなたが直面する2つの最大の問題は次のとおりです。

  • データベースの読み取り時間、DBで検索クエリを実行するのにかかる時間
  • あなたの通話時間、誰かが1秒間に3文字を入力した場合、あなたは1秒間に3回のajax呼び出しを行っています。

非常に基本的な検索の場合、最初の問題はそれほど大きな問題ではありません。小さなテーブルをミリ秒単位で簡単にクエリできますが、大量のテキストを検索すると遅くなります。を乗り越えるための最良の方法は、SphinxやSolrのような検索エンジンを入手することです。それらは、データベースからのデータにインデックスを付けて、迅速で関連性のある検索を行います。

2番目の問題は、ユーザーのキーストロークの間に1秒未満の休憩がある場合(これは視聴者のコンピューターリテラシーによって異なります)、認識によって解決されます。つまり、わずかに一時停止した場合にのみ、ルックアップが実行されます。これは、クエリが少なくなり、システムへの負担が少なくなることを意味します。以下の例:

var typingTimer;
var doneTypingInterval = 1000;

$('.huge-input').stop().keyup(function(e){
    if ((e.which <= 90 && e.which >= 48) || e.which == 8){
        var myHugeInput = $(this);

        clearTimeout(typingTimer);
        typingTimer = setTimeout(
        function(){
                //Do the look up and set data
            },
            doneTypingInterval
        );
    }
});

したがって、ここでは、有効なキー入力の入力ボックスをチェックし、タイマーをクリアしてから、1000ミリ秒(1秒)のタイムアウトを設定します。時間がなくなると、検索を実行してデータを設定しますが、その秒の別の有効なキーストロークは、タイマーをクリアしてリセットします。

お役に立てれば。

于 2013-02-11T15:00:51.177 に答える
1

これが私がそれを行うことができると想像する方法です。

以前のユーザーの検索を記録し、ある種のツリー構造を使用して、ユーザーがあなたと同じことを入力し始めたときに何から入力したかをその場で記録します。次に、辞書で検索を行うだけでよく、速度はそれほど問題ではないようです。もちろん大容量のストレージも必要ですが、大企業なら問​​題ないと思います。

于 2013-02-05T19:09:54.787 に答える
0

個人的には、Dojo が「データ・ストア」に対処する方法がとても気に入っています。とはいえ、ほとんどのソリューションはおそらく jQuery UI のauto completeを中心としています。提案されているように、解決策は、一致のためにサーバーに返される AJAX 要求に依存します。それが力学の基本です。通常、ユーザーがバックスペースを 1 つまたは 2 つ入力したときに、以前に取得した結果を再利用できるように、何らかのキャッシュ スキームが必要になります。速度に関しては、検索するデータセットのサイズによっては、インデックス検索アプローチが必要になる場合があります。ルセンが思い浮かびます。または、データが検索用に最適化されたものに組み込まれている mongoDB ソリューション。

于 2013-02-05T19:01:46.707 に答える