2013-08-06 4 views
18

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

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

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

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

+1

'remote' - это то, что вам нужно. Проверьте последние 2 примера –

+1

Просто идея, просто выбрали минимальное количество символов, а затем запустили функциональную функцию typeahead только с данными, соответствующими полю повторного поиска. Таким образом, у вас не будет 15000 предметов. Но не уверен, что это будет не тяжелее, если пользователь - своего рода исследовательский маньяк. – nubinub

ответ

43

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

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

Конечно, так как ваш 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 
}); 

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

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

+0

Вы заглянули в Бладхаунд? Я пытаюсь вбить клин, нокаутом и ищейкой в ​​голову. Хотя из того, что я видел Bloodhound, он может просто зацепиться за тип. – zeristor

+0

Как бы вы сделали этот Ruby? –

+0

@Jackson_Sandland, который зависит от используемой структуры, и я думаю, вы должны открыть новый вопрос с тегом Ruby для этого –

Смежные вопросы