私は最終的に誰かがこれで私を助けることができることを望んStackOverflowの上に置くことを決めたので、私はこの1つに私の頭をつぶしてきました。高速かつ動的な選択候補
は私が問題をスケッチしてみましょう:
- オートサジェスト機能の最も基本的な使い方は、各キーストローク上のデータベースを照会することです。
この方法の利点は、あなたが常に最新の結果を得ることです。
欠点は、それが遅くなることと基本的には各キーストロークであなたのデータベースに対処するためにやり過ぎであることをできるということです。あなたが 'アメリカ'のようなものを検索すると、データベース上に7つのSELECTクエリが生成される、あなたは国のテーブルを自動募集したいと仮定しよう! この方法はオプションではありません。
- 2番目のオプション(私が現在使用しているもの)は、すべての可能な結果を収集し、JSON形式のフラットファイルに保存することです。 基本的には、1つのファイル、たとえば、すべての国を含むcountries.json。データベースを照会するのではなく、国jsonファイルを指すだけで、各キーストロークはロードされたjsonファイル内を検索します。
この方法は、高速であり、データベースを活用しています。国の例では、コンテンツは非常に動的ではなく、その多くのデータを含んでいないので、jsonフラットファイルは非常に小さくなるため、速くダウンロードされるため、これは良い解決策になります。
しかし、JSONファイルは、動的データが含まれており、大規模なデータセットを持っているときに問題が発生します。 すべての映画と俳優を含む自動募集検索を作成する場合はどうすればよいですか?ファイルは、おそらくダウンロードするには大きすぎるだろうので、 1つのJSONファイル内のすべての結果を置くことはとんでもないだろう。 IMDB(www.imdb.com)を例にしましょう。彼らは自分のウェブサイト上で自動募集機能を持っています。ムービーのタイトルや俳優を検索するのは激しく、何十万ものレコードを検索します。その方法に深く見て、私は次のように注意してください:
あなたはGoogle Chromeのデバッグウィンドウ(または
Filezillaの
FirefoxのFirebugの)を使用する場合: スクリプト用ネットワーク]タブ内で確認してください。たとえば「スターウォーズ」とタイプすると、それぞれの文字を入力すると、別のjsonファイルが読み込まれます。 は、まず、それはそれはstar_w.json で停止st.json、sta.json、等... はどうやらそれは常に第六文字で停止し、s.jsonです。
ロードする各jsonファイルには、文字に一致する8つの結果が含まれています。数字を含むアルファベットの各文字に一致する36個のフォルダがあるようです。 star_w.jsonため 例えばリンクは、私の質問はどのように似たインテリジェントなシステムを構築することになるでhttp://sg.media-imdb.com/suggests/s/star_w.json
のですか?彼らは6文字のすべての可能な組み合わせをjsonファイルとして持っていますか?どのようにファイルを生成しますか? また、タイトルの先頭を見て一致するだけでなく、 「戦争」を検索する場合は、検索結果の中に「スターウォーズ」もあります。
同様のシステムを構築するための助けがあれば、非常に感謝しています。 私はシステムが非常にきれいで速いと思うし、それは多くの目的のために使用することができます!
[OK]を
EDITは、それを働きました。 私の解決策は、DBにクエリを行い、結果をフラットjsonファイルにキャッシュすることの組み合わせです。基本的に、ユーザが、 "スターウォーズ"は、各キーストロークで、私は最初にsearchstringのjsonファイルがあるかどうかをチェックします。存在する場合は、jsonファイルの内容を表示するだけです。ファイルが存在しない場合、またはファイルが設定された特定のタイムライン(たとえば12時間より古い)より古い場合、データベースにクエリを行い、jsonで出力をエコーします。 同時に、出力をjsonファイルに書き込みます。次回に検索すると、フラットファイルからコンテンツが取得され、DBから取得されるのではありません(TTLに達するまで)。 文字の長さを6文字に制限しました。検索文字列が6文字より大きい場合は何も起こりません。最後に見つかった結果の検索結果を見て、「スターウォーズ」の例be star_w
この方法では、キャッシュされたjson結果の収集は、ユーザーの入力に基づいて自動的に設定されます。 テーブルをループしてjsonファイルを生成するスクリプトを書くこともできます...
少なくとも、完璧な解決策ではありませんが、少なくとも、結果をフラットファイルでキャッシュすることでDBの負荷を取り除くことができます。
新しい完了要求を送信する自動補完機能を構築することができます。ユーザーは通常1秒間に複数の文字を入力するため、毎回30秒ごとにリクエストが送信されるため、DBの実行に必要なクエリ数が減ります。 – halfer
FTPクライアントのFileZillaリファレンスは理解できませんでしたか? FireBug for Firefoxを意味するのでしょうか? :) – halfer
@Halfer:ええ、firebugを意味しました:) – cenob8