Si sus consultas dependen de la coincidencia de expresiones regulares, puede mejorar el rendimiento y la eficiencia de su consulta creando una Índice de búsqueda de MongoDB y ejecución de un $search Etapa de canalización de agregación. $regex es ineficiente porque no siempre puede utilizar índices, mientras que los índices de búsqueda de MongoDB mejoran significativamente el rendimiento de sus 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 búsqueda de MongoDB para casos de $regex uso.
Ejemplos
Los ejemplos utilizan un sample_mflix.movies espacio de nombres. Para ejecutar las consultas de ejemplo, añada esta colección a su clúster o utilice las instantáneas preconfiguradas en MongoDB Search Playground. Las consultas de ejemplo muestran 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 su lugar, recomendamos las consultas de búsqueda de MongoDB que utilizan la $search etapa de canalización de agregación. Las siguientes consultas buscan títulos de películas que comiencen con el back prefijo.
➤ Pruebe esto en el patio de búsqueda de MongoDB.
$regex Queries | $search Query | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |
Para ejecutar esta $search consulta, cree 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 su lugar, recomendamos las consultas de búsqueda de MongoDB que utilizan la $search etapa de canalización de agregación. Las siguientes consultas buscan títulos de películas que contengan el término park en cualquier parte del title campo.
➤ Pruebe esto en el patio de búsqueda de MongoDB.
$regex Query | $search Query | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |
Para ejecutar esta $search consulta, cree un índice de búsqueda de 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 utilizando 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 admitir consultas no ancladas eficientes.edgeGramFiltro de tokens para crear tokens de entre cuatro y quince caracteres de longitud.
Nota
Este analizador personalizado solo admite palabras de hasta quince caracteres. Si tiene palabras de más de quince caracteres, aumente el valor maxGram. No se recomienda establecer un valor maxGram superior a quince, ya que valores superiores aumentan el tamaño del índice y podrían afectar el rendimiento y la disponibilidad.
Si su aplicación consulta frecuentemente valores de campos de cadena que terminan con un conjunto de caracteres o sufijos, puede ejecutar consultas de expresiones regulares con la opción $$regex, que busca el final del valor de la cadena, y la i opción, que la hace insensible a mayúsculas y minúsculas.
En su lugar, recomendamos las consultas de búsqueda de MongoDB que utilizan la $search etapa de canalización de agregación. Las siguientes consultas buscan títulos de películas que terminan con el ring término.
➤ Pruebe esto en el patio de búsqueda de MongoDB.
$regex Queries | $search Query | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |
Para ejecutar esta $search consulta, cree 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 tipo
autocompletecon la estrategia de tokenizaciónrightEdgeGrampara dividir el texto en subcadenas o "gramas" de entre 4 (mínimo) y 10 (máximo) caracteres de longitud, lo que admite búsquedas parciales que comienzan desde el final de la cadena.El analizador
lucene.keywordgarantiza coincidencias solo al final del texto, y no al final de las palabras intermedias. Para encontrar coincidencias de sufijos en palabras intermedias, utilicelucene.standard.
Obtén más información
Para obtener más información sobre las consultas de búsqueda de MongoDB, consulte Consultas e índices.
Para obtener más información sobre las consultas regex en MongoDB, consulte $regex.
MongoDB University ofrece un curso gratuito sobre cómo optimizar el rendimiento de MongoDB. Para obtener más información, consulte Monitoreo e información.