Overview
La path el parámetro es utilizado por la búsqueda de MongoDB
operadores para especificar el campo o los campos a buscar. Puede incluir:
A string
Un arreglo de cadenas de texto
Un arreglo que contiene una combinación de cadenas y especificaciones de análisis múltiple
Nota
No todos los operadores pueden usar todos los diferentes tipos de caminos. Consulta la documentación de cada operador individual para obtener detalles sobre los tipos de caminos que admite.
Uso
To search only a single indexed field, use a quoted string in the path parameter. The following example searches a field named description.
"path": "description"
To search multiple indexed fields, use an array of quoted strings in the path parameter. Documents which match on any of the specified fields are included in the result set. The following example searches the description and type fields.
"path": [ "description", "type" ]
Nota
La opción de ruta multi solo está disponible para campos de tipo string.
Si tu definición de índice contiene un campo con varios analizadores, puedes especificar cuál usar. El parámetro path puede aceptar un objeto con los siguientes campos:
Campo | Descripción |
|---|---|
| El nombre del campo que se va a buscar. |
| El nombre del analizador alternativo especificado en un |
| El objeto que contiene el carácter comodín
La ruta de comodín solo es aceptada por los siguientes operadores: También se acepta la trayectoria con comodines para resalte. |
En la siguiente definición de índice, los campos denominados names y notes utilizan el analizador estándar. Un campo denominado comments utiliza standard como su analizador por defecto y también especifica un multi denominado mySecondaryAnalyzer que utiliza el analizador 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" } } } } } }
The following path example searches the comments field using the multi named mySecondaryAnalyzer in the index definition.
"path": { "value": "comments", "multi": "mySecondaryAnalyzer" }
To search a combination of indexed fields and fields with multiple analyzers, use an array. The following example searches the names and notes fields with the default analyzer, and the comments field using the multi named mySecondaryAnalyzer in the index definition.
"path": [ "names", "notes", { "value": "comments", "multi": "mySecondaryAnalyzer" } ]
The following path example searches all the fields that contain the letter n followed by any characters, and the comments field using the multi named mySecondaryAnalyzer in the index definition.
"path": [{ "wildcard": "n*" }, { "value": "comments", "multi": "mySecondaryAnalyzer" }]
Ejemplos
Los siguientes ejemplos utilizan una colección denominada cars, que contiene los siguientes 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." }
Las asignaciones de campo estático te permiten especificar cómo se deben indexar y buscar los campos individuales dentro de una colección.
La definición del índice para la colección cars es la siguiente:
{ "mappings": { "dynamic": false, "fields": { "make": { "type": "string", "analyzer": "lucene.standard" }, "description": { "type": "string", "analyzer": "lucene.standard", "multi": { "simpleAnalyzer": { "analyzer": "lucene.simple", "type": "string" } } } } } }
La definición de índice anterior especifica que el campo make está indexado con el analizador estándar. El campo description utiliza el analizador standard por defecto, pero también puede utilizar el analizador sencillo especificando simpleAnalyzer con el parámetro multi.
Búsqueda en un solo campo
The following example searches for the string Ford in the make field:
db.cars.aggregate([ { $search: { "text": { "query": "Ford", "path": "make" } } } ])
El ejemplo anterior devuelve el documento con _id: 3.
Búsqueda de campos múltiples
El siguiente ejemplo utiliza una matriz de campos en el parámetro path para buscar la cadena blue en el campo make o description.
db.cars.aggregate([ { $search: { "text": { "query": "blue", "path": [ "make", "description" ] } } } ])
La consulta anterior devuelve el siguiente resultado:
{ "_id" : 1, "type" : "sedan", "make" : "Toyota", "description" : "Blue four-door sedan, lots of trunk space. Three to four passengers." }
Búsqueda alternativa de analizador
Ejemplo de Analizador Simple
El siguiente ejemplo utiliza el multi llamado simpleAnalyzer en la definición del índice, que utiliza el analizador simple.
La consulta busca en el campo description la cadena driver.
db.cars.aggregate([ { $search: { "text": { "query": "driver", "path": { "value": "description", "multi": "simpleAnalyzer" } } } } ])
La consulta anterior devuelve el siguiente resultado:
{ "_id" : 2, "type" : "coupe", "make" : "BMW", "description" : "Red two-door convertible, driver's-side airbag." }
El analizador simple indexa driver's
side airbag como [driver s side airbag], por lo que coincide con driver.
Por el contrario, el analizador estándar por defecto indexa driver's side airbag como [driver's side airbag, así que establecería una coincidencia en driver's o side pero no en driver.
Ejemplo de analizador de espacios en blanco
Supongamos que el objeto multi en la definición de índice para la colección cars es el siguiente:
"multi": { "simpleAnalyzer": { "analyzer": "lucene.whitespace", "type": "string" } }
El siguiente ejemplo utiliza el multi denominado simpleAnalyzer en la definición de índice, que utiliza el analizador de espacios en blanco.
db.cars.aggregate([ { $search: { "text": { "query": "Three", "path": { "value": "description", "multi": "simpleAnalyzer" } } } } ])
La consulta anterior devuelve el siguiente resultado:
{ "_id" : 1, "type" : "sedan", "make" : "Toyota", "description" : "Blue four-door sedan, lots of trunk space. Three to four passengers." }
Para la query anterior correspondiente al término Three, MongoDB Search solo devuelve documentos que coinciden con el término Three y no con three porque el analizador de espacios en blanco es sensible a las mayúsculas y minúsculas. Por el contrario, el analizador estándar por defecto no distingue entre mayúsculas y minúsculas y devuelve todos los documentos que coinciden con el término en la query en el orden en que están listados en la colección.
Ahora, considera la siguiente 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" } } } ])
La consulta anterior devuelve los siguientes 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 }
En la query anterior, MongoDB Search devuelve documentos que contienen tanto Three como three. Sin embargo, el puntaje del resultado con Three es mayor porque, mientras que el documento con three se coincidió utilizando el analizador estándar por defecto, el documento con Three se coincidió tanto por el simpleAnalyzer específico como por el analizador estándar.por defecto.
El siguiente ejemplo utiliza una colección llamada posts con los siguientes 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." } }
Mapeos de campos dinámicos permiten indexar todos los campos en una colección según sea necesario.
La definición del índice para la colección posts es la siguiente:
{ "mappings": { "dynamic": true } }
Búsqueda de campo anidado
La siguiente consulta del operador compuesto busca en el campo post.body la cadena broccoli, y también especifica que el campo no debe contener la cadena cauliflower.
db.posts.aggregate([ { $search: { "compound": { "must": { "text": { "query": "broccoli", "path": "post.body" } }, "mustNot": { "text": { "query": "cauliflower", "path": "post.body" } } } } } ])
La query anterior devuelve el documento con _id: 1, en el que el campo de posts.body contiene la string broccoli.
Búsqueda de campo comodín
El siguiente ejemplo utiliza una colección llamada cars, que tiene los siguientes 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" } ] }
La definición del índice para la colección cars es la siguiente:
{ "mappings": { "dynamic": true } }
Las siguientes queries buscan en los campos especificados utilizando el comodín * la string red.
Ejemplo de búsqueda en todos los campos
La siguiente query busca en todos los campos la string red.
db.cars.aggregate([ { "$search": { "phrase": { "path": { "wildcard": "*" }, "query": "red" } } } ])
La query devuelve los siguientes 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" } ] }
Ejemplo de búsqueda de campo anidado
La siguiente query busca la string red en los campos anidados dentro del campo warehouse.
db.cars.aggregate([ { "$search": { "text": { "path": { "wildcard": "warehouse.*" }, "query": "red" } } } ])
La query devuelve los siguientes 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" } ] }