Construir um caminho de query
Nesta página
Visão geral
O parâmetro path
é usado pelos operadores do Atlas Search para especificar o campo ou campos a serem pesquisados. Pode conter:
Um string
Um array de strings
Uma especificação de multianalisador
Uma array contendo uma combinação de strings e especificações de vários analisadores
Observação
Nem todos os operadores podem usar todos os diferentes tipos de caminhos. Consulte a documentação de cada operador individual para obter detalhes sobre os tipos de caminho suportados.
Uso
Para pesquisar somente um único campo indexado, use uma string entre aspas no parâmetro path
. O exemplo a seguir pesquisa um campo denominado description
.
"path": "description"
Para pesquisar múltiplos campos indexados, utilize uma array de strings citadas no parâmetro path
. Os documentos que correspondem a qualquer um dos campos especificados são incluídos no conjunto de resultados. O exemplo seguinte pesquisa os campos description
e type
.
"path": [ "description", "type" ]
Observação
A opção de caminho do multi
está disponível somente para campos do tipo string.
Se sua definição de índice contiver um campo com vários analisadores, você poderá especificar qual deles usar. O parâmetro path
pode pegar um objeto com os seguintes campos:
Campo | Descrição |
---|---|
value | O nome do campo a ser pesquisado. |
multi | O nome do analisador alternativo especificado em um objeto multi em uma definição de índice. Para saber mais, consulte Multianalisador. |
wildcard | O objeto que contém o caractere curinga
O caminho curinga só é aceito pelos seguintes operadores: O caminho curinga também é aceito para destacar. |
Na definição de índice a seguir, os campos chamados names
e notes
usam o padrão . Um campo denominado comments
utiliza standard
como seu analisador padrão e também especifica um multi
denominado mySecondaryAnalyzer
que utiliza o analisador lucene.whitespace.
{ "mappings": { "dynamic": false, "fields": { "names": { "type": "string", "analyzer": "lucene.standard" }, "notes": { "type": "string", "analyzer": "lucene.standard" }, "comments": { "type": "string", "analyzer": "lucene.standard", "multi": { "mySecondaryAnalyzer": { "analyzer": "lucene.whitespace", "type": "string" } } } } } }
O seguinte exemplo do path
pesquisa o campo comments
utilizando o multi
denominado mySecondaryAnalyzer
na definição do índice.
"path": { "value": "comments", "multi": "mySecondaryAnalyzer" }
Para procurar uma combinação de campos indexados e campos com vários analyzer, use uma array. O exemplo a seguir procurar os campos names
e notes
com o analisador padrão e o campo comments
usando o multi
denominado mySecondaryAnalyzer
na definição do índice.
"path": [ "names", "notes", { "value": "comments", "multi": "mySecondaryAnalyzer" } ]
O exemplo path
a seguir procurar todos os campos que contêm a letra n
seguida por qualquer caractere e o campo comments
usando o multi
chamado mySecondaryAnalyzer
na definição do índice.
"path": [{ "wildcard": "n*" }, { "value": "comments", "multi": "mySecondaryAnalyzer" }]
Exemplos
Os seguintes exemplos utilizam uma coleção denominada cars
que tem os seguintes documentos:
{ "_id" : 1, "type" : "sedan", "make" : "Toyota", "description" : "Blue four-door sedan, lots of trunk space. Three to four passengers." } { "_id" : 2, "type" : "coupe", "make" : "BMW", "description" : "Red two-door convertible, driver's-side airbag." } { "_id" : 3, "type" : "SUV", "make" : "Ford", "description" : "Black four-door SUV, three rows of seats." }
Mapeamentos de campo estáticos permitem especificar como campos individuais dentro de uma coleção devem ser indexados e pesquisados.
A definição do índice para a coleção cars
é a seguinte:
{ "mappings": { "dynamic": false, "fields": { "make": { "type": "string", "analyzer": "lucene.standard" }, "description": { "type": "string", "analyzer": "lucene.standard", "multi": { "simpleAnalyzer": { "analyzer": "lucene.simple", "type": "string" } } } } } }
A definição de índice anterior especifica que o campo make
é indexado com o analisador padrão. O campo description
utiliza o analisador standard
por padrão, mas também pode utilizar o analisador simples especificando simpleAnalyzer
com o parâmetro multi
.
Pesquisa de campo único
O exemplo a seguir procura o Ford
de string no campo make
:
db.cars.aggregate([ { $search: { "text": { "query": "Ford", "path": "make" } } } ])
O exemplo anterior retorna o documento com _id: 3
.
Pesquisa de vários campos
O exemplo a seguir usa um array de campos no parâmetro path
para pesquisar a string blue
no campo make
ou description
.
db.cars.aggregate([ { $search: { "text": { "query": "blue", "path": [ "make", "description" ] } } } ])
A query anterior retorna o seguinte resultado:
{ "_id" : 1, "type" : "sedan", "make" : "Toyota", "description" : "Blue four-door sedan, lots of trunk space. Three to four passengers." }
Pesquisa alternativa de analisador
Exemplo de analisador simples
O exemplo seguinte utiliza o multi
denominado simpleAnalyzer
na definição de índice, que utiliza o analisador simples.
A query pesquisa o campo description
para a string driver
.
db.cars.aggregate([ { $search: { "text": { "query": "driver", "path": { "value": "description", "multi": "simpleAnalyzer" } } } } ])
A query anterior retorna o seguinte resultado:
{ "_id" : 2, "type" : "coupe", "make" : "BMW", "description" : "Red two-door convertible, driver's-side airbag." }
O analisador simples indexa driver's
side airbag
como [driver s side airbag
], então ele corresponde em driver
.
Por outro lado, os índices padrão do analisador driver's side airbag
como [driver's side airbag
], então ele corresponderia em driver's
ou side
mas não driver
.
Exemplo de analisador de espaços em branco
Suponha que o objeto multi
na definição de índice para a coleção cars
seja o seguinte:
"multi": { "simpleAnalyzer": { "analyzer": "lucene.whitespace", "type": "string" } }
O exemplo a seguir usa multi
denominado simpleAnalyzer
na definição do índice, que usa o analyzer de espaço em branco.
db.cars.aggregate([ { $search: { "text": { "query": "Three", "path": { "value": "description", "multi": "simpleAnalyzer" } } } } ])
A query anterior retorna o seguinte resultado:
{ "_id" : 1, "type" : "sedan", "make" : "Toyota", "description" : "Blue four-door sedan, lots of trunk space. Three to four passengers." }
Para a query acima sobre o termo Three
, o Atlas Search retorna apenas documentos que correspondem ao termo Three
e não three
, pois o analisador de espaço em branco diferencia maiúsculas de minúsculas. Por outro lado, o analisador padrão padrão não diferencia maiúsculas de minúsculas e retorna todos os documentos que correspondem ao termo na query na ordem em que estão listados na coleção.
Agora, considere a seguinte query:
db.cars.aggregate([ { $search: { "compound": { "should": [ { "text": { "path": "description", "query": "Three" } }, { "text": { "query": "Three", "path": { "value" : "description", "multi" : "simpleAnalyzer" }, score: { boost: { value: 2 }} } } ] } } }, { $project: { "_id": 0, "type": 1, "description": 1, "score": { "$meta": "searchScore" } } } ])
A query anterior retorna os seguintes resultados:
{ "type" : "sedan", "description" : "Blue four-door sedan, lots of trunk space. Three to four passengers seats.", "score" : 1.1092689037322998 } { "type" : "SUV", "description" : "Black four-door SUV, three rows of seats.", "score" : 0.17812025547027588 }
Para a query acima, o Atlas Search retorna documentos tanto com Three
quanto com three
. No entanto, a pontuação do resultado com Three
é maior porque, enquanto o documento com three
foi combinado usando o analisador padrão, o documento com Three
foi combinado tanto pelo analisador específico simpleAnalyzer
quanto pelo analisador padrão.
O exemplo seguinte utiliza uma coleção denominada posts
com os seguintes documentos:
{ "_id": 1, "username": "pinto", "post": { "date": "12-03-2018", "forum": "Tofu Recipes", "body": "Spicy Garlic Tofu cooks up crispy in 10 minutes or less. Serve with broccoli and rice for a delicious vegetarian meal." } } { "_id": 2, "username": "paloma", "post": { "date": "12-08-2018", "forum": "Tofu Recipes", "body": "Crispy Tofu in Shiitake Broth has flavors of citrus and umami. Great as an appetizer or entree." } }
Os mapeamentos de campo dinâmicos permitem indexar todos os campos em uma coleção conforme necessário.
A definição do índice para a coleção posts
é a seguinte:
{ "mappings": { "dynamic": true } }
Pesquisa em campo aninhado
A seguinte query composta pesquisa o campo post.body
para a string broccoli
, e também especifica que o campo não deve conter a string cauliflower
.
db.posts.aggregate([ { $search: { "compound": { "must": { "text": { "query": "broccoli", "path": "post.body" } }, "mustNot": { "text": { "query": "cauliflower", "path": "post.body" } } } } } ])
A query anterior retorna o documento com _id: 1
, no qual o campo posts.body
contém a string broccoli
.
Pesquisa de campo curinga
O exemplo seguinte utiliza uma coleção denominada cars
, que tem os seguintes documentos:
{ "_id" : 1, "type" : "sedan", "make" : "Toyota", "description" : "Four-door sedan, lots of trunk space. Three to four passengers.", "warehouse" : [ { "inventory" : 3, "color" : "red" } ] } { "_id" : 2, "type" : "coupe", "make" : "BMW", "description" : "Two-door convertible, driver's-side airbag.", "warehouse" : [ { "inventory" : 5, "color" : "black" } ] } { "_id" : 3, "type" : "SUV", "make" : "Ford", "description" : "Four-door SUV, three rows of seats.", "warehouse" : [ { "inventory" : 7, "color" : "white" }, { "inventory" : 3, "color" : "red" } ] }
A definição do índice para a coleção cars
é a seguinte:
{ "mappings": { "dynamic": true } }
As seguintes queries pesquisam os campos especificados utilizando o caractere curinga *
para a string red
.
Exemplo de pesquisa de todos os campos
A seguinte query pesquisa todos os campos para a string red
.
db.cars.aggregate([ { "$search": { "phrase": { "path": { "wildcard": "*" }, "query": "red" } } } ])
A query retorna os seguintes resultados:
{ "_id" : 1, "type" : "sedan", "make" : "Toyota", "description" : "Four-door sedan, lots of trunk space. Three to four passengers.", "warehouse" : [ { "inventory" : 3, "color" : "red" } ] } { "_id" : 3, "type" : "SUV", "make" : "Ford", "description" : "Four-door SUV, three rows of seats.", "warehouse" : [ { "inventory" : 7, "color" : "white" }, { "inventory" : 3, "color" : "red" } ] }
Exemplo de pesquisa de campo aninhado
A seguinte query pesquisa os campos aninhados dentro do campo warehouse
para a string red
.
db.cars.aggregate([ { "$search": { "text": { "path": { "wildcard": "warehouse.*" }, "query": "red" } } } ])
A query retorna os seguintes resultados:
{ "_id" : 1, "type" : "sedan", "make" : "Toyota", "description" : "Four-door sedan, lots of trunk space. Three to four passengers.", "warehouse" : [ { "inventory" : 3, "color" : "red" } ] } { "_id" : 3, "type" : "SUV", "make" : "Ford", "description" : "Four-door SUV, three rows of seats.", "warehouse" : [ { "inventory" : 7, "color" : "white" }, { "inventory" : 3, "color" : "red" } ] }