Mongodb requête par expression régulière
J'utilise Mongodb pour stocker la liste des endroits à travers le monde, avec plus de 2M de dossiers. Chaque enregistrement est un objet comme ceci:
{ "_id" : ObjectId("4e5b339feee76320ab26f930"), "city" : "New York", "longitude" : -87.2008333, "latitude" : 30.8383333, "country_code" : "US", "country_name" : "United States" }
Je veux effectuer la recherche pour obtenir toutes les "VILLES" contenir "New York", il m'a fallu environ 10 secondes pour avoir le résultat (il est inacceptable dans mon système web). J'ai indexation de la "ville" à l'aide de ensureIndex() de la fonction, mais la requête est toujours lent.
Voici ma requête:
db.locations.find({"city": { "$regex": "(New York)", "$options": 'i' }})
Je crois que le problème est la "expression régulière". Pouvez-vous me suggérer une solution pour obtenir le résultat de la requête dans un délai de 2-3 secondes (j'ai plus de 4M enregistrements dans MySQL, la requête similaire m'a fallu seulement 1 à 2 secondes - avec index).
Merci et salutations.
OriginalL'auteur ofecrpnr | 2011-08-29
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas rechercher à contenir de l'opération dans mongodb sans utiliser regexp ou javascript (ils sont lents, en raison de travaux sans index).
Je peux vous proposer d'enregistrer d'autres ville de la basse de cas et de recherche en plein match. Si vous voulez "contient" et la vitesse rapide, vous devez utiliser un autre texte complet des moteurs de recherche comme solr ou lucene.
vous êtes les bienvenus.
OriginalL'auteur Andrew Orsich
Je recommande l'utilisation de plusieurs touches.
exemple:
ensuite, vous pouvez utiliser
ce sera plus rapide
OriginalL'auteur iMysak
mongo ne pas utiliser les index pour les regexp quand il recherche avec insensibles à la casse, donc je vous propose de stocker votre terrain avec des lettres en majuscules ou en minuscules et les utiliser pour la recherche.
au lieu de recherche contenant si vous recherchez commencer avec, comme ci-dessous
db.les emplacements.find({"ville": { "$regex": /^New York/}})
votre requête sera de retour rapide .
pour plus d'info
http://www.mongodb.org/display/DOCS/Advanced+Requêtes#AdvancedQueries-RegularExpressions
OriginalL'auteur Swapnil Sonawane