Как использовать typeahead.js с большой базой данных

У меня есть большая база данных из 10 000 адресов и 5000 человек.

Я хочу, чтобы пользователи искали базу данных для адреса или пользователя. Я бы хотел использовать тип Twitterа, чтобы предлагать результаты при вводе текста.

См. пример NBA здесь: http://twitter.github.io/typeahead.js/examples.

Я понимаю, что предварительная выборка 15 000 предметов не была бы оптимальной с точки зрения скорости и нагрузки. Что было бы лучшим способом добиться этого?

Ответы

Ответ 1

Поскольку никто не ответил, я продолжу свое предложение.

Я думаю, что лучше всего подходит для вашей большой базы данных, используя 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 вы можете поймать этот запрос и посмотреть его в своей БД:

$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);

Конечно, поскольку ваша БД довольно большая, вы должны оптимизировать свой SQL-запрос для запроса быстрее, возможно, кэшировать результат и т.д.

На стороне typeahead, чтобы уменьшить нагрузку на запрос 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
});

Таким образом, на самом деле не имеет значения, насколько велика ваша БД, этот подход должен работать хорошо.

Это пример в PHP, но, конечно, он должен быть одинаковым для любого имеющегося у вас бэкэнд. Надеюсь, вы получите основную идею.