Si tus querys dependen de la coincidencia de expresiones regulares, puedes mejorar el rendimiento y la eficiencia de tu query creando una Índice de búsqueda de MongoDB y ejecución de un $search etapas del pipeline de agregación. $regex es ineficiente porque no siempre puede aprovechar los índices, mientras que MongoDB Search indexes mejoran notablemente el rendimiento de las queries y ofrecen más opciones para personalizar los parámetros de query.
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 su aplicación consulta frecuentemente valores de cadena que comienzan con un conjunto de caracteres o prefijo, puede usar la $regex opción,,^ que busca desde el comienzo del valor de la cadena, y,i 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.
➤ Pruebe esto en el patio de búsqueda de MongoDB.
$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 string, que utiliza el analizador personalizado autocomplete-search para campos indexados y el analizador lucene.standard para consultas. El analizador personalizado denominado autocomplete-search es el analyzer para campos indexados y el lucene.standard es el searchAnalyzer para consultas. El analizador personalizado denominado
lowercaseFiltro de token para transformar todos los caracteres a minúsculas para admitir consultas que no distingan entre mayúsculas y minúsculasedgeGramfiltro de tokens para crear tokens de entre4y10caracteres de longitud
Nota
Este analizador personalizado solo admite palabras de hasta diez caracteres. Si espera palabras y consultas de más de diez caracteres, aumente el valor maxGram. No recomendamos establecer un valor maxGram superior a quince, ya que un valor superior aumenta el tamaño del índice y podría afectar el rendimiento y la disponibilidad.
Si su aplicación consulta frecuentemente cadenas que están presentes en cualquier parte del campo, puede ejecutar consultas, que verifican cada documento y devuelven todas las coincidencias sin ningún orden en $regex 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.
➤ Pruebe esto en el patio de búsqueda de MongoDB.
$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 puntuación.lowercaseFiltro de token para transformar las letras a minúsculas para admitir consultas que no distinguen 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.
➤ Pruebe esto en el patio de búsqueda de MongoDB.
$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.