2

そこで、町のリストを含むオートコンプリート ドロップダウンを用意しました。最初は、データベースにあった 20 ほどしかありませんでしたが、最近、データの一部が他の郡、さらには他の州にあることに気付きました。したがって、それに対する答えは、米国内のすべての町を含むデータベースの 1 つを購入することでした (はい、知っています。ジオコーディングが答えですが、時間の制約により、その機能を利用する時間ができるまでこれを行っています)。

つまり、20 ~ 25 の町があったとき、オートコンプリートは見事に機能しましたが、80,000 になった今ではそれほど簡単ではありません。

タイプするとき、これを行う最善の方法はデフォルトでこの状態にすることだと考えています。ページに州セレクターを追加します。デフォルトは NJ で、必要に応じて別の州を選択できます。これにより、リストが 1000 未満に絞り込まれます。ただし、同じ問題が発生する可能性があります。大量のデータを含むオートコンプリートの回避策を知っている人はいますか?

Web サービスのコードを投稿する必要がありますか?

4

6 に答える 6

10

1文字だけ入力した後にオートコンプリートしようとしていますか? たぶん2つ以上まで待つ...?

また、上位 10 行などを返すことはできますか?

于 2008-10-07T00:26:09.957 に答える
2

あなたのアプリケーションは、返されるデータの量で窒息し、ブラウザによってレンダリングされようとしているようです。

データベースには適切なインデックスがあり、パフォーマンスの問題はないと思います。

あなたのサービスの結果を 100 件以下に制限します。ユーザーはそれ以上の方法は見ません。

また、2 つまたは 3 つの文字が入力されると、サービスからデータを取得するだけになり、クエリの範囲がさらに縮小されます。

幸運を!

于 2008-10-07T00:27:08.287 に答える
1

あなたは正しい軌道に乗っていると思います。State -> County -> Township という一連のカスケード入力を使用します。後続の各入力は、前の入力の値に基づいて潜在人口を取得します。各入力は、潜在的な母集団に対して検証され、誤った入力を回避します。毎回データベースに戻るのではなく、中間結果をキャッシュし、オートコンプリートのためにクエリを実行することをお勧めします。

于 2008-10-07T00:28:57.300 に答える
1

ばかげた質問かもしれませんが... 町名の列にインデックスがあることを確認しましたか? 80K の名前がデータベースに負荷をかけるべきではないと思います...

于 2008-10-07T00:26:10.940 に答える
1

基礎となる SQL を制御できる場合は、where 句に複数の「OR like」行を含む 1 つのクエリではなく、複数の「UNION」クエリを試すことができます。

SQL の最適化に関するこの記事を確認してください。

于 2008-10-07T00:43:40.017 に答える
0

TOP 句を使用して SQL クエリを制限するだけです。like の代わりに「less than」を使用することも好きです。

select top 10 name from cities where @partialname < name order by name;

その「Ce」は「Cedar Grove」と「Cedar Knolls」だけでなく、「Chatham」と「Cherry Hill」も提供するため、常に 10 を取得します。

LINQ では:

var q = (from c in db.Cities
        where partialname < c.Name
        orderby c.Name
        select c.Name).Take(10);
于 2008-10-07T03:58:42.400 に答える