2013-07-06 17 views
20

Voglio trovare un conto in base al nome (in una collezione MongoDB di 50K conti)MongoDB, le prestazioni di query espressioni regolari sui campi indicizzati

nel solito modo: troviamo con lo spago

db.accounts.find({ name: 'Jon Skeet' }) // indexes help improve performance! 

Che ne dici di un'espressione regolare? È un'operazione costosa?

db.accounts.find({ name: /Jon Skeet/ }) // worry! how indexes work with regex? 

Edit:

Secondo WiredPrairie:
MongoDB utilizzare prefisso di RegEx di ricercare indici (ex: /^prefix.*/):

db.accounts.find({ name: /^Jon Skeet/ }) // indexes will help!' 

MongoDB $regex

+6

@dirkk, voglio avere più esperienze e spiegazioni. Voglio anche condividere la domanda. – damphat

+2

Per regex usare un indice, deve usare un'ancora come mostrato nei documenti: http://docs.mongodb.org/manual/reference/operator/regex/ – WiredPrairie

+0

possibile duplicato di [Come interrogare mongodb con "mi piace" ?] (http://stackoverflow.com/questions/3305561/how-to-query-mongodb-with-like) – WiredPrairie

risposta

20

In realtà in base alla documentazione,

Se esiste un indice per il campo, poi MongoDB corrisponde al regolare espressione contro i valori dell'indice, che può essere più veloce di una scansione collezione. Ulteriore ottimizzazione può verificarsi se l'espressione regolare è una "espressione prefisso", il che significa che tutte le potenziali corrispondenze iniziano con la stessa stringa. Ciò consente a MongoDB di costruire un "intervallo" da quel prefisso e corrispondere solo a quei valori dall'indice che rientrano in tale intervallo.

http://docs.mongodb.org/manual/reference/operator/query/regex/#index-use

In altre parole:

Per/Jon Skeet/regex, Mongo si completa la scansione delle chiavi nell'indice poi sarà recuperare i documenti corrispondenti, che possono essere più veloce di scansione di raccolta.

Per/^ Jon Skeet/regex, mongo analizzerà solo l'intervallo che inizia con la regex dell'indice, che sarà più veloce.

+1

regex funziona bene se c'è una corrispondenza immediata (cioè: corrispondente alla lettera 'a'). Ma se abbino una parola completa i risultati impiegano molto più tempo (es .: 'angolare'). Si tratta di documenti 6M, c'è comunque la possibilità di velocizzare queste query? Stanno prendendo ovunque da 19-30 secondi per 8+ caratteri, ma tornano immediatamente con 1-2 caratteri. – chovy

+0

@chovy, credo che MongoDB non sia lo strumento migliore per cercare le occorrenze di stringhe nel mezzo del testo - Suggerisco di guardare ElasticSearch o qualsiasi altro motore di ricerca full-text. – heroin

Problemi correlati