web-dev-qa-db-ja.com

typeahead.jsを大規模なデータベースで使用する方法

10,000の住所と5,000人の大規模なデータベースがあります。

ユーザーにデータベースでアドレスまたはユーザーのいずれかを検索させたい。 Twitterの先行入力を使用して、テキストを入力する結果を提案したいと思います。

NBAの例を参照してください: http://Twitter.github.io/typeahead.js/examples

15,000個のアイテムをプリフェッチすることは、速度と負荷の観点から最適ではないことを理解しています。これを試して達成するためのより良い方法は何ですか?

24
alias51

誰も答えていないので、その提案を続けます。

大きなデータベースに最適なのは、remotetypeahead.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の例ですが、もちろん、どのバックエンドを使用する場合でも同じである必要があります。基本的なアイデアが得られれば幸いです。

46
Hieu Nguyen