2013-08-06 17 views
18

Mam dużą bazę danych zawierającą 10 000 adresów i 5000 osób.Jak korzystać z typeahead.js z dużą bazą danych

Chcę umożliwić użytkownikom przeszukiwanie bazy danych pod kątem adresu lub użytkownika. Chciałbym użyć Twittera, by sugerować wyniki podczas wprowadzania tekstu.

Zobacz przykład NBA tutaj: http://twitter.github.io/typeahead.js/examples.

Rozumiem, że wstępne pobieranie 15 000 elementów nie byłoby optymalne z punktu widzenia prędkości i obciążenia. Jaki byłby lepszy sposób, aby spróbować to osiągnąć?

+1

'remote' jest tym, czego potrzebujesz. Sprawdź dwa ostatnie przykłady: –

+1

Po prostu pomysł, po prostu wybierz minimalną liczbę znaków, a następnie uruchom funkcję z głowicą z tylko danymi pasującymi do pola reasearch. W ten sposób nie będziesz mieć 15000 przedmiotów. Ale nie jestem pewien, czy nie będzie cięższy, jeśli użytkownik jest jakimś maniakiem badań. – nubinub

Odpowiedz

43

Ponieważ nikt nie udzielił żadnej odpowiedzi, postąpię zgodnie z moją sugestią.

Myślę, że najlepiej pasuje do Twojej dużej bazy danych przy użyciu remote z typeahead.js. Krótki przykład:

$('#user-search').typeahead({ 
    name: 'user-search', 
    remote: '/search.php?query=%QUERY' // you can change anything but %QUERY 
}); 

Co robi to podczas wpisywania znaków w input#user-search wyśle ​​żądania AJAX do strony search.php z zapytaniem jak treść wejściu.

Na search.php można złapać tej kwerendy i szukać go w 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); 

Oczywiście ponieważ Twój DB jest dość duże, należy zoptymalizować zapytanie SQL kwerendy szybciej, może buforować wynik, itp

na stronie wpisywanie znaków z wyprzedzeniem, w celu zmniejszenia obciążenia kwerendy DB można określić minLength lub 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 
}); 

Tak naprawdę nie ma znaczenia, jak duże jest twoje DB, to podejście powinno dobrze działać.

To jest przykład w PHP, ale oczywiście powinien on być taki sam dla każdego backendu. Mam nadzieję, że otrzymasz podstawowy pomysł.

+0

Czy zaglądasz do Bloodhound? Próbuję wepchnąć mi do głowy kombinezony, knockout i bloodhound. Chociaż z tego, co widziałem w Bloodhound, może po prostu wciągnąć się w głowę. – zeristor

+0

Jak zrobiłbyś to Ruby? –

+0

@Jackson_Sandland, który zależy od używanego frameworku i domyślam się, że powinieneś otworzyć nowe pytanie z tagiem Ruby dla tego –

Powiązane problemy