Menu Docs
Página inicial do Docs
/
MongoDB Atlas
/ /

Use o Atlas Search para queries Regex de texto completo

Nesta página

  • Evite correspondência Regex ineficiente
  • Exemplo
  • Saiba mais

Se suas queries dependerem de uma correspondência regex ineficiente, crie e execute uma query do Atlas Search com as fases do pipeline de agregação $search para melhorar o desempenho de queries de texto que possuem mais opções para personalizar seus parâmetros de query.

Se você costuma executar queries regex que não diferenciam maiúsculas de minúsculas (utilizando a opção i ), recomendamos usar queries do Atlas Search que usem o aggregation pipeline stage $search.

É possível especificar agrupamento em um índice para definir regras específicas do idioma para comparação de string , como regras para letras maiúsculas e acentos. No entanto, o agrupamento pode causar alguma perda de funcionalidade em comparação com as queries do Atlas Search. Em ambientes que não sejam do Atlas Search, índices sensíveis a maiúsculas e minúsculas não melhoram o desempenho das consultas de regex. O operador de query $regex não reconhece agrupamentos e não pode usar índices sensíveis a maiúsculas e minúsculas de forma eficaz. Os índices do Atlas Search melhoram significativamente o desempenho de queries que diferenciam maiúsculas de minúsculas e oferecem mais opções para personalizar os parâmetros da query.

Considere uma recolha employees com os seguintes documentos. Esta coleção não tem índices além do índice _id padrão:

// employees collection
{
"_id": 1,
"first_name": "Hannah",
"last_name": "Simmons",
"dept": "Engineering"
},
{
"_id": 2,
"first_name": "Michael",
"last_name": "Hughes",
"dept": "Security"
},
{
"_id": 3,
"first_name": "Wendy",
"last_name": "Crawford",
"dept": "Human Resources"
},
{
"_id": 4,
"first_name": "MICHAEL",
"last_name": "FLORES",
"dept": "Sales"
}

Se o seu aplicativo consulta frequentemente o campo first_name, talvez você queira executar queries regex sem distinção entre maiúsculas e minúsculas para encontrar mais facilmente os nomes correspondentes. O regex com distinção entre maiúsculas e minúsculas também corresponde a formatos de dados diferentes, como no exemplo acima, em que você tem first_names de "Michael" e "MICHAEL". No entanto, recomendamos as queries do Atlas Search que usam o estágio do pipeline de agregação $search.

Se um usuário pesquisar a string "michael", o aplicativo poderá executar a seguinte query:

db.employees.find( { first_name: { $regex: /michael/i } } )

Como essa query especifica a opção i de $regex, ela não diferencia maiúsculas de minúsculas. A query retorna os seguintes documentos:

{ "_id" : 2, "first_name" : "Michael", "last_name" : "Hughes", "dept" : "Security" }
{ "_id" : 4, "first_name" : "MICHAEL", "last_name" : "FLORES", "dept" : "Sales" }

Embora essa query retorne os documentos esperados, as queries regex sem distinção entre maiúsculas e minúsculas e incompatíveis com índices não são muito eficientes. Para melhorar o desempenho, crie um índice do Atlas Search:

{
"mappings": {
"dynamic": true
}
}

O agrupamento pode causar alguma perda de funcionalidade. Quando o campo strength de um documento collation de um índice é 1 ou 2, o índice não diferencia maiúsculas de minúsculas. Para obter uma descrição detalhada do documento do agrupamento e dos diferentes valores de strength, consulte Documento de agrupamento.

Para que o aplicativo use o índice que diferencia maiúsculas de minúsculas, você também deve especificar o mesmo documento de agrupamento do índice na query regex. Embora seja possível remover o operador $regex do método find() anterior e usar o índice recém-criado, recomendamos que você use uma query do Atlas Search que utilize a fase do pipeline de agregação $search.

Query sem distinção entre maiúsculas e minúsculas
Query do Atlas Search
db.employees.find( { first_name: "michael" } ).collation( { locale: 'en', strength: 2 } )
db.employees.aggregate([
{
$search: {
"index": "default",
"text": {
"path": "first_name",
"query": "michael"
}
}
}
])

Importante

Não use o operador $regex ao usar um índice que não diferencia maiúsculas de minúsculas em sua query. A implementação $regex não reconhece agrupamentos e não pode utilizar índices que não diferenciam maiúsculas de minúsculas. Em vez disso, recomendamos as queries do Atlas Search que usam a fase do pipeline de agregação $search.

Voltar

Desempenho da Pesquisa