私はこれに頭を悩ませてきたので、誰かが私を助けてくれることを願って、最終的にそれをStackoverflowに置くことにしました。
問題をスケッチしましょう:
- 自動提案機能の最も基本的な使用法は、キーストロークごとにデータベースを照会することです。
この方法の利点は、常に最新の結果が得られることです。
欠点は、速度が遅くなる可能性があることと、基本的に、キーストロークごとにデータベースをアドレス指定するのはやり過ぎであるということです。国テーブルを自動提案したいとします。「アメリカ」などを検索すると、データベースで 7 つの SELECT クエリが生成されます。したがって、この方法はオプションではありません。
- 2 番目のオプション (私が現在使用しているもの) は、考えられるすべての結果を収集し、それを JSON 形式のフラット ファイルに保存することです。したがって、基本的には、すべての国を含むcountries.jsonなどの単一のファイルになります。データベースにクエリを実行する代わりに、countries json ファイルを指定するだけで、キーストロークごとにロードされた json ファイル内が検索されます。
この方法は高速で、データベースを活用します。国の例では、コンテンツがそれほど動的ではなく、それほど多くのデータが含まれていないため、json フラット ファイルが非常に小さくなり、ダウンロードが速くなるため、これは良い解決策になります。
しかし、json ファイルに動的データが含まれていて、大きなデータセットがある場合に問題が発生します。すべての映画と俳優を含む自動提案検索を構築したい場合はどうすればよいでしょうか? ファイルが大きすぎてダウンロードできない可能性があるため、すべての結果を 1 つの json ファイルに入れるのはばかげています。例として IMDB (www.imdb.com) を見てみましょう。彼らのウェブサイトには自動提案機能があります。映画のタイトルや俳優の検索は非常に高速で、数十万件のレコードから検索できます。彼らの方法を詳しく見てみると、次のことがわかります。
Google Chrome デバッグ ウィンドウ (またはFilezilla Firefox Firebug)を使用している場合: [ネットワーク] タブでスクリプトを探します。たとえば「スターウォーズ」と入力すると、各文字を入力することで個別の json ファイルが読み込まれることに気付きます。最初はs.json、次にst.json、sta.jsonなど... star_w.json で止まります
どうやら常に 6 文字目で止まるようです。
読み込まれる各 json ファイルには、文字に一致する 8 つの結果が含まれます。数字を含むアルファベット一文字一文字が一致するフォルダが36個あるそうです。たとえば、 star_w.jsonのリンクはhttp://sg.media-imdb.com/suggests/s/star_w.jsonです。
私の質問は、同様のインテリジェント システムをどのように構築しますか? json ファイルとして 6 文字の可能なすべての組み合わせがありますか? どのようにファイルを生成しますか? また、一致を確認するためにタイトルの先頭だけを確認するわけではないことにも注意してください。したがって、「wars」を検索すると、検索結果に「star wars」も表示されます。
同様のシステムを構築するための助けをいただければ幸いです。システムは非常にきちんとしていて高速で、さまざまな目的に使用できると思います!
編集
わかりました、うまくいきました。私の解決策は、DB のクエリとフラット json ファイルへの結果のキャッシュの組み合わせです。基本的に、ユーザーが「スターウォーズ」などと入力すると、キーストロークごとに、検索文字列のjsonファイルがあるかどうかを最初に確認します。存在する場合は、json ファイルの内容を表示します。ファイルが存在しない場合、またはファイルが設定した特定の時間制限よりも古い場合 (たとえば、12 時間より古い場合)、データベースにクエリを実行し、json で出力をエコーします。同時に、出力を json ファイルに書き込みます。次に検索を行うときは、DB からではなく、フラット ファイルからコンテンツを取得します (もちろん TTL に達するまで)。文字の長さを 6 文字に制限したので、検索文字列が 6 文字より大きい場合は何も起こりません。star_w
このメソッドを使用すると、キャッシュされた json 結果のコレクションが、ユーザー入力に基づいて自動的に入力されます。テーブルをループしてjsonファイルを生成するスクリプトを書くこともできます...
私はそれが完璧な解決策ではないことを知っていますが、少なくとも結果をフラットファイルにキャッシュすることで、DB の負荷を軽減することができます。