2011-11-22 14 views
9

Dire che ho una raccolta di utenti e voglio implementare il completamento automatico sui nomi utente di quegli utenti. Ho guardato i documenti di mongodb e $ regex sembra essere un modo per farlo. C'è un modo migliore? Per meglio intendo più performante/pratica migliore.Implementare il completamento automatico su MongoDB

risposta

9

Come suggerito da @Thilo, è possibile utilizzare diverse idee tra cui il prefisso.

La cosa più importante è avere richiesta molto veloce (perché si vuole completare automaticamente a sentirsi instaneous). Quindi devi usare una query che userà correttamente gli indici.

Con regexp: utilizzare /^prefix/ (la cosa importante è la^per specificare l'inizio della riga che è obbligatorio per fare in modo che la query usi l'indice).

La query intervallo è troppo buono: { $gt : 'jhc', $lt: 'jhd' } }

più complicato, ma più veloce: è possibile memorizzare prefisso-alberi in Mongo (cerca aka) con voci come:

{usrPrefix : "anna", compl : ["annaconda", "annabelle", "annather"]} 
{usrPrefix : "ann", compl : ["anne", "annaconda", "annabelle", "annather"]} 

Quest'ultima soluzione è molto veloce (se gli indici su compl ovviamente) ma non lo spazio efficiente a tutti. Conoscete il trade-off che avete scelto troppo.

+0

Ottima risposta. Non avevo però completato con tentativi. Personalmente non ho mai avuto una sensazione "istantanea" nell'usare Regexes in Mongo. Questo dovrebbe fare il trucco per renderlo molto più veloce! – Vivek

+0

In effetti, le regexp in mongo non sono davvero ben implementate. Tuttavia, quando vuoi qualcosa di fluido che non pensi di interrogare il database in tempo reale, la latenza è semplicemente troppo alta. Un modo corretto per implementare il completamento automatico consiste nel caricare in modo asincrono alcuni consueti completamenti e completare il tempo (e l'input dell'utente). – kamaradclimber

2

Se siete alla ricerca di prefissi, è possibile utilizzare una query di gamma (non sono sicuro circa l'esatta sintassi):

db.users.find({'username': { $gt : 'jhc', $lt: 'jhd' } }) 

E si desidera un indice sul campo nome utente.

+0

Puoi spiegare come funziona la query di intervallo in questo esempio? per esempio se ho "gatti" nella mia collezione come "ca" restituirà il termine corretto. – wazzaday

+0

È possibile cercare qualsiasi cosa tra "ca" e "cb". 'ca Thilo

5

Noi lo facciamo usando regex ed è veloce fino a quando si dispone di un indice e si utilizza/^ valore/

essere consapevoli non è possibile utilizzare il caso dell'opzione insensibile con un indice, quindi si consiglia di memorizzare una versione minuscola della stringa come un altro campo nel documento e utilizzarla per il completamento automatico.

Ho eseguito test con oltre 3 milioni di documenti e risulta ancora istantaneo.

Problemi correlati