Si tus queries se basan en la coincidencia con expresiones regulares, puedes mejorar el rendimiento y la eficiencia de tus queries al crear un índice de búsqueda de MongoDB y ejecutar una etapa $search de la canalización de agregación. $regex es ineficaz porque no siempre puede hacer uso de los índices, mientras que los MongoDB Search indexes mejoran significativamente el rendimiento de tus consultas y ofrecen más opciones para personalizar los parámetros de consulta.
Esta página describe algunas configuraciones comunes de índices y consultas de MongoDB Search para $regex casos de uso.
Ejemplos
Los ejemplos utilizan un espacio de nombres sample_mflix.movies. Para ejecutar las consultas de muestras, agrega esta colección a tu clúster o utiliza las instantáneas preconfiguradas en el MongoDB Search Playground. Las consultas de muestra demuestran cómo usar $search en lugar de $regex para los siguientes casos de uso:
Si tu aplicación frecuentemente $regex para valores de string que comienzan con un conjunto de caracteres o un prefijo, podría utilizar la opción ^, que busca desde el inicio del valor de string, y i, lo que la hace insensible a mayúsculas y minúsculas.
En cambio, recomendamos consultas de MongoDB Search que utilicen la etapa de la canalización de agregación $search. Las siguientes consultas buscan títulos de películas que comienzan con el prefijo back.
➤ Prueba esto en el Playground de MongoDB Search.
$regex Queries | $search Query | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |
Para ejecutar esta $search query, crea un índice de búsqueda de MongoDB similar al siguiente:
{ "mappings": { "dynamic": false, "fields": { "title": [ { "type": "string", "analyzer": "autocomplete-search", "searchAnalyzer": "lucene.standard" } ] } }, "analyzers": [ { "name": "autocomplete-search", "tokenizer": { "type": "standard" }, "tokenFilters": [ { "type": "lowercase" }, { "type": "edgeGram", "minGram": 4, "maxGram": 10 } ] } ] }
Esta definición de índice indexa el campo title de la colección movies como el tipo de string que utiliza el analizador personalizado autocomplete-search para los campos indexados y el analizador lucene.standard para las consultas. El analizador personalizado llamado autocomplete-search como analyzer para los campos indexados y lucene.standard como searchAnalyzer para las consultas. El analizador personalizado llamado
lowercasefiltro de tokens para transformar todos los caracteres a minúsculas para admitir consultas que no detectan mayúsculas ni minúsculasedgeGramfiltro de tokens para crear tokens de entre4y10caracteres de longitud
Nota
Este analizador personalizado solo admite palabras de hasta 10 caracteres de longitud. Si esperas palabras y consultas más largas de diez caracteres, aumenta el valor de maxGram. No se recomienda establecer un valor maxGram superior a quince porque los valores más altos aumentan el tamaño del índice y podrían afectar el rendimiento y la disponibilidad.
Si la aplicación realiza queries frecuentes de strings que están presentes en cualquier parte del campo, se podrían ejecutar queries $regex, que comprueban cada documento y devuelven todas las coincidencias sin ningún orden particular.
En cambio, recomendamos consultas de MongoDB Search que utilicen la etapa de la canalización de agregación $search. Las siguientes consultas buscan títulos de películas que contengan el término park en cualquier lugar del campo title.
➤ Prueba esto en el Playground de MongoDB Search.
$regex Query | $search Query | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |
Para ejecutar esta $search query, crea un índice de búsqueda MongoDB con la siguiente definición:
{ "mappings": { "dynamic": false, "fields": { "title": { "type": "string", "analyzer": "contains", "searchAnalyzer": "lucene.standard" } } }, "analyzers": [ { "name": "contains", "tokenizer": { "type": "standard" }, "tokenFilters": [ { "type": "lowercase" }, { "type": "reverse" }, { "type": "edgeGram", "minGram": 4, "maxGram": 15 }, { "type": "reverse" } ] } ] }
Esta definición de índice indexa el campo title en la colección movies como el tipo string usando un analizador personalizado llamado contains que aplica lo siguiente:
standardtokenizador para dividir las palabras por espacios en blanco o signos de puntuación.lowercasefiltro de token para transformar las letras a minúsculas para admitir consultas sin distinción entre mayúsculas y minúsculas.reversefiltro de token (dos veces) para invertir las palabras y respaldar eficientemente consultas no ancladas.edgeGramfiltro de token para crear tokens de entre cuatro y quince caracteres de longitud.
Nota
Este analizador personalizado sólo admite palabras de hasta quince caracteres de longitud. Si tienes palabras de más de quince caracteres, aumenta el valor de maxGram. No se recomienda establecer un valor maxGram superior a quince, ya que los valores más altos aumentan el tamaño del índice y pueden afectar el rendimiento y la disponibilidad.
Si tu aplicación consulta frecuentemente valores de campos de string que terminan con una serie de caracteres o sufijos, podrías ejecutar queries regex con la opción $regex $, que busca al final del valor de string, y la opción i, que hace que la query no distinga entre mayúsculas y minúsculas.
En cambio, recomendamos consultas de MongoDB Search que utilicen la etapa de la canalización de agregación $search. Las siguientes consultas buscan títulos de películas que terminen con el término ring.
➤ Prueba esto en el Playground de MongoDB Search.
$regex Queries | $search Query | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |
Para ejecutar esta $search query, crea un índice de búsqueda de MongoDB similar al siguiente:
{ "mappings": { "dynamic": false, "fields": { "title": [ { "type": "autocomplete", "minGrams": 4, "maxGrams": 10, "analyzer": "lucene.keyword", "tokenization": "rightEdgeGram" } ] } } }
Esta definición de índice indexa el campo title utilizando el:
El tipo
autocompletecon la estrategia de tokenizaciónrightEdgeGrampara la división el texto en subcadenas o "gramas" de entre 4 (mínimo) y 10 (máximo) caracteres de longitud, lo que soporta búsquedas parciales que comienzan desde el final de la string.El analizador
lucene.keywordpara garantizar coincidencias solo al final del texto y no al final de términos intermedios. Para encontrar coincidencias de sufijos en palabras intermedias, utilicelucene.standard.
Obtén más información
Para aprender más sobre las consultas de MongoDB Search, consulta Consultas e índices.
Para aprender más sobre las consultas de expresiones regulares en MongoDB, consulta $regex.
MongoDB University ofrece un curso gratuito sobre la optimización del rendimiento de MongoDB. Para aprender más, consulta Supervisión y perspectivas.