Se suas queries dependerem da correspondência de regex, você poderá melhorar o desempenho e a eficiência da sua query criando um MongoDB Search index e executando um $search fases do pipeline de agregação. $regex é ineficiente porque nem sempre pode fazer uso de índices, enquanto os índices do MongoDB Search melhoram significativamente o desempenho de suas querys e oferecem mais opções para personalizar parâmetros de query.
Esta página descreve algumas configurações comuns de índice e query do MongoDB Search para casos de uso$regex.
Exemplos
Os exemplos utilizam um namespace do sample_mflix.movies. Para executar as queries de amostra, adicione esta coleção ao seu cluster ou use os snapshots pré-configurados no MongoDB Search Playground. As queries de exemplo demonstram como utilizar o $search ao invés do $regex para os seguintes casos de uso:
Se o seu aplicativo query frequentemente valores de string que começam com um conjunto de caracteres ou prefixo, ele poderá usar a opção $regex ^, que pesquisa desde o início do valor da string, e i, que a torna maiúsculas e minúsculas- insensível.
Em vez disso, recomendamos queries do MongoDB Search que usem o estágio do pipeline de agregação $search. As queries a seguir procuram títulos de filmes que começam com o prefixo back.
➤ Tente fazer isso no playground do MongoDB Search.
$regex Consultas | $search Query | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |
Para executar esta $search query, crie um índice de MongoDB Search semelhante ao seguinte:
{ "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 } ] } ] }
Essa definição de índice indexa o campo title na coleção movies como o tipo string que usa o analisador personalizado autocomplete-search para campos indexados e o analisador lucene.standard para queries. O analisador personalizado nomeou autocomplete-search como analyzer para campos indexados e o lucene.standard como searchAnalyzer para queries. O analisador personalizado chamado
lowercasefiltro de token para transformar todos os caracteres em minúsculas para dar suporte a queries que não diferenciam maiúsculas de minúsculasedgeGramfiltro de token para criar tokens de4a10caracteres de comprimento
Observação
Esse analisador personalizado suporta apenas palavras com até dez caracteres. Se você espera palavras e queries com mais de dez caracteres, aumente o valor maxGram. Não recomendamos definir um valor maxGram superior a 15 porque valores mais altos aumentam o tamanho do índice e podem impacto o desempenho e a disponibilidade.
Se o seu aplicativo query com frequência strings que estão presentes em qualquer lugar no campo, você pode executar queries$regex, que verificam cada documento e retornam todas as correspondências em nenhuma ordem específica.
Em vez disso, recomendamos queries do MongoDB Search que usem o estágio do pipeline de agregação $search. As queries a seguir procuram títulos de filmes que contenham o termo park em qualquer lugar do campo title.
➤ Tente fazer isso no playground do MongoDB Search.
$regex Query | $search Query | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |
Para executar esta $search query, crie um índice de Pesquisa MongoDB com a seguinte definição:
{ "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" } ] } ] }
Essa definição de índice indexa o campo title na coleção movies como o tipo string usando um analisador personalizado chamado contains que aplica o seguinte:
standardtokenizador para divisão as palavras por espaço em branco ou pontuação.lowercasefiltro de token para transformar as letras em minúsculas para dar suporte a queries sem distinção entre maiúsculas e minúsculas.reversefiltro de token (duas vezes) para inverter as palavras para suporte queries não ancoradas eficientes.edgeGramfiltro de token para criar tokens de comprimento entre quatro e 15 caracteres.
Observação
Esse analisador personalizado suporta apenas palavras com até 15 caracteres. Se você tiver palavras com mais de 15 caracteres, aumente o valor de maxGram. Não é recomendável definir um valor maxGram superior a 15 porque valores mais altos aumentam o tamanho do índice e podem impacto o desempenho e a disponibilidade.
Se o seu aplicativo query com frequência os valores de campos de string que terminam com um conjunto de caracteres ou sufixo, executar queries regex com a opção $regex $, que procura o final do valor da string, e a opção i, que torna insensível a maiúsculas e minúsculas.
Em vez disso, recomendamos queries do MongoDB Search que usem o estágio do pipeline de agregação $search. As queries a seguir pesquisam títulos de filmes que terminem com o termo ring.
➤ Tente fazer isso no playground do MongoDB Search.
$regex Consultas | $search Query | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |
Para executar esta $search query, crie um índice de MongoDB Search semelhante ao seguinte:
{ "mappings": { "dynamic": false, "fields": { "title": [ { "type": "autocomplete", "minGrams": 4, "maxGrams": 10, "analyzer": "lucene.keyword", "tokenization": "rightEdgeGram" } ] } } }
Esta definição de índice indexa o campo title utilizando o:
O tipo
autocompletecom a estratégia de tokenizaçãorightEdgeGrampara divisão o texto em substrings ou "gramas" entre 4 (mínimo) e 10 (máximo) caracteres de comprimento, que suporta pesquisas parciais a partir do final de a string.O analisador
lucene.keyworddeve garantir as correspondências apenas no final do texto e não no final das palavras intermediárias. Para encontrar correspondências de sufixo em palavras intermediárias, uselucene.standard.
Saiba mais
Para saber mais sobre queries de pesquisa MongoDB, consulte Queries e índices.
Para saber mais sobre queries regex no MongoDB, consulte $regex.
A Universidade de MongoDB oferece um curso gratuito sobre como otimizar o desempenho do MongoDB. Para saber mais, consulte Monitoramento e insights.