regex
Definição
regex
regex
interpreta o campoquery
como uma expressão regular.regex
é um operador de nível de termo, o que significa que o campoquery
não é analisado.Observação
A linguagem de expressão regular disponível para o operador
regex
é um subconjunto limitado da biblioteca PCRE.Para obter informações detalhadas, consulte o Class RegExp documentação.
Sintaxe
regex
tem a seguinte sintaxe:
1 { 2 $search: { 3 "index": <index name>, // optional, defaults to "default" 4 "regex": { 5 "query": "<search-string>", 6 "path": "<field-to-search>", 7 "allowAnalyzedField": <boolean>, 8 "score": <options> 9 } 10 } 11 }
Opções
regex
usa os seguintes termos para construir uma consulta:
Campo | Tipo | Descrição | necessidade | Default |
---|---|---|---|---|
query | cadeia de caracteres ou matriz de cadeias de caracteres | String ou strings para pesquisar. | sim | |
path | cadeia de caracteres ou matriz de cadeias de caracteres | Campo ou campos indexados a serem pesquisados. Você também pode especificar um caminho curinga para pesquisar. Consulte construção de caminho para ter mais informações. | sim | |
allowAnalyzedField | booleano | Deve ser definido para true se a query for executada em um campo analisado. | no | false |
score | objeto | Pontuação a ser atribuída aos resultados correspondentes dos termos de pesquisa. As opções são:
| no |
Comportamento
regex
é um operador de nível de termo, o que significa que o campo query
não é analisado. As pesquisas com expressões regulares funcionam bem com o analisador de palavras-chave, pois ele indexa os campos uma palavra de cada vez. Para fazer uma pesquisa com distinção entre maiúsculas e minúsculas, não use o analisador padrão, o analisador standard, porque o analisador standard
reduz todas as letras minúsculas dos termos. Em vez disso, especifique um analisador diferente.
É possível utilizar o operador regex
para executar pesquisas em um campo analisado definindo a opção allowAnalyzedField
para true
, mas você pode obter resultados inesperados.
Exemplo
A pesquisa de *Star Trek*
em um campo indexado com o analisador keyword
encontra todos os documentos nos quais o campo contém a string Star Trek
em qualquer contexto. A pesquisa de *Star
Trek*
em um campo indexado com o analisador padrão não encontra nada, pois há um espaço entre Star
e Trek
, e o índice não contém espaços.
Comportamento da Expressão Regular Lucene
O operador Atlas Search regex
utiliza o mecanismo de expressão regular Lucene, que difere de Expressões regulares compatíveis com Perl.
Caracteres reservados
Os seguintes caracteres são reservados como operadores quando usados em expressões comuns:
. ? + * | { } [ ] ( ) < > " \ @ #
Para usar qualquer um dos caracteres acima literalmente em uma expressão correspondente, inicie com um caractere \
.
Exemplo
who\?
corresponde a "quem?"
Ao usar o caractere de escape em mongosh
ou com um driver, é necessário usar uma barra invertida dupla antes do caractere a ser escapado.
Exemplo
Para criar uma expressão curinga que procure qualquer string que contenha um asterisco literal em um aggregation pipeline, use a seguinte expressão:
"*\\**"
O primeiro e o último asteriscos funcionam como curingas que correspondem a qualquer caractere, e o \\*
corresponde a um asterisco literal.
Observação
Use a seguinte expressão para escapar de uma barra invertida literal:
"*\\\*"
Operadores suportados
Operador | Descrição | Exemplo |
---|---|---|
. | Corresponde a qualquer caractere. | x.z matches "xyz", "xaz", etc. |
? | O caractere anterior é opcional e corresponde se não ocorrer mais de uma vez. | xyz? corresponde a "xy" e "xyz" |
+ | O caractere anterior corresponde se ocorrer uma ou mais vezes. | xy+ corresponde a "xy", "xyy", "xyyy", etc. |
* | O caractere anterior corresponde se ocorrer qualquer número de vezes. | xyz* corresponde a "xy", "xyz", "xyzz" etc. |
| | O operador OR . A expressão corresponderá se o mais longo dos dois padrões em cada lado do operador | for correspondente. | abc|xyz corresponde a "abc" ou "xyz" |
{<number>} | O caractere anterior corresponde se ocorrer exatamente <number> vezes. | xyz{3} corresponde a "xyzzz" |
() | Caracteres dentro dos parênteses são tratados como uma unidade única para fins de correspondência. | xyz(abc)[2] corresponde "xyzabcabc" |
[] | Corresponde a qualquer caractere dentro dos colchetes. Adicionar um Dentro dos colchetes, | [xyz] matches "x", "y", and "z"[^abc] matches any character except "a", "b", or "c"[a-d] matches "a", "b", "c", or "d"[0-9] matches any numeric character from 0 through 9 |
<> | Corresponder uma faixa numérica. | <1-3> corresponde a "1", "2" e "3" |
# | O operador de idioma vazio. O operador # não corresponde a nenhuma string, incluindo uma string vazia. | #|xyz corresponde a "xyz" e nada mais |
Operadores não suportados
regex
não suporta os operadores âncora ^
e $
.
Exemplos
Os exemplos a seguir usam a collection movies
no banco de dados sample_mflix
com uma definição de índice personalizada que usa o analisador de palavras-chave. Se você tiver o sample dataset em seu cluster, poderá criar um Atlas Search index na movies
e executar as querys de exemplo em seu cluster.
Dica
Se você já carregou o conjunto de dados de amostra, siga o tutorial Iniciar com Atlas Search para criar uma definição de índice e executar queries de Atlas Search.
Definição de Índice
A seguinte definição de índice indexa o campo title
na coleção movies
com o analisador de palavra-chave:
1 { 2 "mappings": { 3 "fields": { 4 "title": { 5 "analyzer": "lucene.keyword", 6 "type": "string" 7 } 8 } 9 } 10 }
O exemplo a seguir pesquisa todos os campos title
para títulos de filmes que terminam com a palavra Seattle
. A expressão comum (.*)
corresponde a qualquer número de caracteres.
1 db.movies.aggregate([ 2 { 3 "$search": { 4 "regex": { 5 "path": "title", 6 "query": "(.*) Seattle" 7 } 8 } 9 }, 10 { 11 $project: { 12 "_id": 0, 13 "title": 1 14 } 15 } 16 ])
A query acima retorna os seguintes resultados:
{ "title" : "Sleepless in Seattle" } { "title" : "Battle in Seattle" }
O exemplo a seguir usa a expressão regular [0-9]{2} (.){4}s
para encontrar títulos de filmes que começam com um número de 2 dígitos seguido por um espaço e terminam com uma palavra de 5 letras terminando em s
.
1 db.movies.aggregate([ 2 { 3 "$search": { 4 "regex": { 5 "path": "title", 6 "query": "[0-9]{2} (.){4}s" 7 } 8 } 9 }, 10 { 11 $project: { 12 "_id": 0, 13 "title": 1 14 } 15 } 16 ])
A query acima retorna os seguintes resultados:
{ "title" : "20 Dates" } { "title" : "25 Watts" } { "title" : "21 Grams" } { "title" : "13 Lakes" } { "title" : "18 Meals" } { "title" : "17 Girls" } { "title" : "16 Acres" } { "title" : "26 Years" } { "title" : "99 Homes" } { "title" : "45 Years" }