If your queries rely on regex matching, you can improve the performance and efficiency of your query by creating a MongoDB Search index and running a $search aggregation pipeline stage. $regex is inefficient because it cannot always make use of indexes whereas MongoDB Search indexes significantly improve the performance of your queries and offer more options for customizing query parameters.
Esta página describe algunas configuraciones comunes de índices y consultas de MongoDB Search para $regex casos de uso.
Ejemplos
The examples use an sample_mflix.movies namespace. To run the sample queries, add this collection to your cluster or use the pre-configured snapshots in the MongoDB Search Playground. The sample queries demonstrate how to use $search instead of $regex for the following use cases:
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.
Instead, we recommend MongoDB Search queries that use the $search aggregation pipeline stage. The following queries search for movie titles that start with the prefix back.
➤ Prueba esto en el Playground de MongoDB Search.
$regex Queries | $search Query | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |
To run this $search query, create a MongoDB Search index similar to the following:
{ "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.
Instead, we recommend MongoDB Search queries that use the $search aggregation pipeline stage. The following queries search for movie titles that contain the term park anywhere in the title field.
➤ Prueba esto en el Playground de MongoDB Search.
$regex Query | $search Query | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |
To run this $search query, create a MongoDB Search index with the following definition:
{ "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.
Instead, we recommend MongoDB Search queries that use the $search aggregation pipeline stage. The following queries search for movie titles that end with the term ring.
➤ Prueba esto en el Playground de MongoDB Search.
$regex Queries | $search Query | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |
To run this $search query, create a MongoDB Search index similar to the following:
{ "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
To learn more about MongoDB Search queries, see Queries and Indexes.
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.