10,000の住所と5,000人の大規模なデータベースがあります。
ユーザーにデータベースでアドレスまたはユーザーのいずれかを検索させたい。 Twitterの先行入力を使用して、テキストを入力する結果を提案したいと思います。
NBAの例を参照してください: http://Twitter.github.io/typeahead.js/examples 。
15,000個のアイテムをプリフェッチすることは、速度と負荷の観点から最適ではないことを理解しています。これを試して達成するためのより良い方法は何ですか?
誰も答えていないので、その提案を続けます。
大きなデータベースに最適なのは、remote
とtypeahead.js
を使用することです。簡単な例:
$('#user-search').typeahead({
name: 'user-search',
remote: '/search.php?query=%QUERY' // you can change anything but %QUERY
});
input#user-search
に文字を入力すると、AJAXページにリクエストを送信しますsearch.php
入力の内容としてクエリを使用します]。
search.php
で、このクエリをキャッチしてDBで検索できます。
$query = $_GET['query'].'%'; // add % for LIKE query later
// do query
$stmt = $dbh->prepare('SELECT username FROM users WHERE username LIKE = :query');
$stmt->bindParam(':query', $query, PDO::PARAM_STR);
$stmt->execute();
// populate results
$results = array();
foreach ($stmt->fetchAll(PDO::FETCH_COLUMN) as $row) {
$results[] = $row;
}
// and return to typeahead
return json_encode($results);
もちろんDBは非常に大きいため、SQLクエリを最適化してクエリを高速化したり、結果をキャッシュしたりする必要があります.
先行入力側では、クエリDBへの負荷を減らすために、minLength
またはlimit
を指定できます。
$('#user-search').typeahead({
name: 'user-search',
remote: '/search.php?query=%QUERY',
minLength: 3, // send AJAX request only after user type in at least 3 characters
limit: 10 // limit to show only 10 results
});
したがって、DBの大きさは実際には関係ありません。このアプローチはうまく機能するはずです。
これはPHPの例ですが、もちろん、どのバックエンドを使用する場合でも同じである必要があります。基本的なアイデアが得られれば幸いです。