2013-07-06 5 views
20

ich namentlich ein Konto finden möchte (in einer MongoDB Sammlung von 50K-Konten)MongoDB, Leistung der Abfrage anhand eines regulären Ausdrucks auf indizierten Feldern

In gewohnter Weise: wir mit String finden

Wie wäre es mit regulärem Ausdruck? Ist es eine teure Operation?

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

Edit:

Nach WiredPrairie:
MongoDB verwenden Präfix von RegEx Indizes zum Nachschlagen (ex: /^prefix.*/):

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

MongoDB $regex

+6

@dirkk, ich möchte mehr Erfahrungen und Erklärungen bekommen. Ich möchte auch die Frage teilen. – damphat

+2

Damit Regex einen Index verwenden kann, muss er einen Anker verwenden, wie in der Dokumentation gezeigt: http://docs.mongodb.org/manual/reference/operator/regex/ – WiredPrairie

+0

mögliches Duplikat von [Wie man mongodb mit "Gefällt mir" abfragt ?] (http://stackoverflow.com/questions/3305561/how-to-query-mongodb-with-like) – WiredPrairie

Antwort

20

Eigentlich nach der Dokumentation,

Wenn ein Index für das Feld vorhanden ist, dann entspricht MongoDB den regulären Ausdruck gegen die Werte im Index, die schneller als eine Sammlung Scan sein kann. Weitere Optimierung kann auftreten, wenn der reguläre Ausdruck ein "Präfix-Ausdruck" ist, was bedeutet, dass alle möglichen Übereinstimmungen mit der gleichen Zeichenfolge beginnen. Dadurch kann MongoDB einen " " Bereich von diesem Präfix erstellen und nur mit den Werten aus dem Index übereinstimmen, die in diesen Bereich fallen.

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

Mit anderen Worten:

For/Jon Skeet/regex, Mongo wird voll die Schlüssel im Index scannen dann die passenden Dokumente holen, die als Sammlung Scan schneller sein kann.

Für/^ Jon Skeet/Regex wird Mongo nur den Bereich scannen, der mit der Regex im Index beginnt, was schneller sein wird.

+1

regex funktioniert gut, wenn es eine unmittelbare Übereinstimmung gibt (dh: der Buchstabe 'a' entspricht). Aber wenn ich mit einem ganzen Wort übereinstimme, dauert das Ergebnis viel länger (zB: "eckig"). Dies ist in 6M-Dokumenten, gibt es sowieso, um diese Abfragen zu beschleunigen? Sie nehmen zwischen 19 und 30 Sekunden für mehr als 8 Zeichen, kommen aber sofort mit 1-2 Zeichen zurück. – chovy

+0

@chovy, ich glaube MongoDB ist nicht das beste Werkzeug für die Suche nach String-Vorkommen in der Mitte des Textes - ich schlage vor, ElasticSearch oder andere Volltext-Suchmaschinen zu betrachten. – heroin

Verwandte Themen