Docs Menu
Docs Home
/ /

Actualice las consultas $text con MongoDB Search para mejorar el rendimiento de búsqueda

Si sus consultas dependen en gran medida de la $text En la etapa de canalización de agregación, puede modificar estas consultas para usarlas $search en lugar de mejorar tanto la flexibilidad como el rendimiento de estas consultas.

La $search etapa de agregación proporciona las siguientes características que no están disponibles a través del $text operador, están disponibles pero tienen menos rendimiento o solo están disponibles con un trabajo de implementación significativo por parte del usuario:

Los ejemplos de las siguientes secciones utilizan consultas sample_mflix.movies en la colección de los datos de ejemplo para ilustrar las mejoras de flexibilidad y rendimiento que ofrece MongoDB Search con respecto a. Puede ejecutar las consultas de ambos ejemplos utilizando los siguientes $text índices:

Text Index
Índice de búsqueda de MongoDB
db.movies.createIndex(
{
genres: "text",
plot: "text",
year: -1
}
)
{
"mappings": {
"dynamic": false,
"fields": {
"genres": {
"type": "string"
},
"plot": {
"type": "string"
},
"year": {
"type": "number"
}
}
}
}

Cualquiera de las definiciones de índice indexará los genres plot campos y como texto, y el year campo como numérico. Para obtener instrucciones sobre cómo crear índices,$text consulte Crear un índice de texto. Para obtener instrucciones sobre cómo crear índices de búsqueda de MongoDB, consulte Crear un índice de búsqueda de MongoDB.

Puede actualizar sus consultas basadas en para $textusar $search y así mayor flexibilidad y comodidad. En este ejemplo, consultará la sample_mflix.movies colección de los datos de muestra para recuperar las entradas con la palabra "poeta" en el plot campo, ordenadas ascendentemente por año.

Las definiciones de índice descritas en la sección anterior ilustran una de las mejoras de flexibilidad $search de. Para crear el $text índice sample_mflix.movies en, primero debe eliminar cualquier índice de texto existente en los datos de muestra mediante el método, ya que MongoDB solo admite un índice de texto por db.collection.dropIndex() colección.

Por el contrario, puede crear múltiples índices de búsqueda de MongoDB para una sola colección, lo que permite que sus aplicaciones aprovechen distintas consultas de texto completo en paralelo.

Las siguientes consultas devuelven las cinco películas más recientes con 'poeta' en el campo plot, mostrando sus títulos, géneros, tramas y años de estreno.

Regex Index
Índice de búsqueda de MongoDB
db.movies.find(
{
$text: { $search: "poet" }
},
{
_id: 0,
title: 1,
genres: 1,
plot: 1,
year: 1
}
).limit(5)
db.movies.aggregate([
{
"$search": {
"text": {
"path": "plot",
"query": "poet"
}
}
},
{
"$limit": 5
},
{
"$project": {
"_id": 0,
"title": 1,
"genres": 1,
"plot": 1,
"year": 1,
}
}
])

Ambas consultas devuelven los siguientes resultados:

{
plot: `It's the story of the murder of a poet, a man, a great film director: Pier Paolo Pasolini. The story begin with the arrest of "Pelosi", a young man then accused of the murder of the poet. ...`,
genres: [ 'Crime', 'Drama' ],
title: 'Who Killed Pasolini?',
year: 1995
},
{
plot: 'Friendship and betrayal between two poets during the French Revolution.',
genres: [ 'Biography', 'Drama' ],
title: 'Pandaemonium',
year: 2000
},
{
year: 2003,
plot: 'Story of the relationship between the poets Ted Hughes and Sylvia Plath.',
genres: [ 'Biography', 'Drama', 'Romance' ],
title: 'Sylvia'
},
{
year: 2003,
plot: 'Story of the relationship between the poets Ted Hughes and Sylvia Plath.',
genres: [ 'Biography', 'Drama', 'Romance' ],
title: 'Sylvia'
},
{
plot: 'A love-struck Italian poet is stuck in Iraq at the onset of an American invasion.',
genres: [ 'Comedy', 'Drama', 'Romance' ],
title: 'The Tiger and the Snow',
year: 2005
}

Una característica exclusiva de MongoDB Search es la posibilidad de resaltar los resultados, mostrando las coincidencias en los contextos donde se encontraron. Para ello, sustituya la consulta de MongoDB Search anterior por la siguiente:

1db.movies.aggregate([
2 {
3 "$search": {
4 "text": {
5 "path": "plot",
6 "query": "poet"
7 },
8 "highlight": {
9 "path": "plot"
10 }
11 }
12 },
13 {
14 "$limit": 1
15 },
16 {
17 "$project": {
18 "_id": 0,
19 "title": 1,
20 "genres": 1,
21 "plot": 1,
22 "year": 1,
23 "highlights": { "$meta": "searchHighlights" }
24 }
25 }
26])

Los resultados de la consulta anterior incluyen el campo highlights, que contiene tanto el contexto en el que se produjeron todas las coincidencias como las puntuaciones de relevancia de cada una. Por ejemplo, a continuación se muestra el campo highlights del primer documento en los resultados $search.

{
plot: `It's the story of the murder of a poet, a man, a great film director: Pier Paolo Pasolini. The story begin with the arrest of "Pelosi", a young man then accused of the murder of the poet. ...`,
genres: [ 'Crime', 'Drama' ],
title: 'Who Killed Pasolini?',
year: 1995,
highlights: [
{
score: 1.0902210474014282,
path: 'plot',
texts: [
{ value: "It's the story of the murder of a ", type: 'text' },
{ value: 'poet', type: 'hit' },
{
value: ', a man, a great film director: Pier Paolo Pasolini. ',
type: 'text'
}
]
},
{
score: 1.0202842950820923,
path: 'plot',
texts: [
{
value: 'The story begin with the arrest of "Pelosi", a young man then accused of the murder of the ',
type: 'text'
},
{ value: 'poet', type: 'hit' },
{ value: '. ...', type: 'text' }
]
}
]
}

Además de una mayor flexibilidad y comodidad, MongoDB Search ofrece importantes ventajas de rendimiento en comparación con consultas análogas. Considere una consulta en $text la sample_mflix.movies colección para recuperar películas estrenadas entre el 2000 y 2010 el, del género de comedia, con la palabra "poeta" en el plot campo.

Ejecute las siguientes consultas:

Text Index
Índice de búsqueda de MongoDB
db.movies.aggregate([
{
$match: {
year: {$gte: 2000, $lte: 2010},
$text: { $search: "poet" },
genres : { $eq: "Comedy" }
}
},
{ "$sort": { "year": 1 } },
{
"$limit": 3
},
{
"$project": {
"_id": 0,
"title": 1,
"genres": 1,
"plot": 1,
"year": 1
},
}
])
db.movies.aggregate([
{
"$search": {
"compound": {
"filter": [{
"range": {
"gte": 2000,
"lte": 2010,
"path": "year"
}
},
{
"text": {
"path": "plot",
"query": "poet"
}
},
{
"text": {
"path": "genres",
"query": "comedy"
}
}]
}
}
},
{ "$sort": { "year": 1 } },
{
"$limit": 3
},
{
"$project": {
"_id": 0,
"title": 1,
"genres": 1,
"plot": 1,
"year": 1
}
}
])

Ambas consultas devolverán los siguientes tres documentos.

{
year: 2000,
plot: 'A film poem inspired by the Peruvian poet Cèsar Vallejo. A story about our need for love, our confusion, greatness and smallness and, most of all, our vulnerability. It is a story with many...',
genres: [ 'Comedy', 'Drama' ],
title: 'Songs from the Second Floor'
},
{
plot: 'When his mother, who has sheltered him his entire 40 years, dies, Elling, a sensitive, would-be poet, is sent to live in a state institution. There he meets Kjell Bjarne, a gentle giant and...',
genres: [ 'Comedy', 'Drama' ],
title: 'Elling',
year: 2001
},
{
plot: 'Heart-broken after several affairs, a woman finds herself torn between a Poet and a TV Host.',
genres: [ 'Comedy', 'Romance', 'Drama' ],
title: 'Easy',
year: 2003
}

Aunque es adecuado para búsquedas simples y específicas como esta, a medida que aumenta el tamaño de los conjuntos de datos y la amplitud de las consultas, las ventajas de rendimiento $text de $search mejorarán significativamente la capacidad de respuesta de sus aplicaciones. Le recomendamos utilizar una consulta de búsqueda de MongoDB a través de la $search etapa de canalización de agregación.

  • Para obtener más información sobre las consultas de búsqueda de MongoDB, consulte Consultas e índices.

  • MongoDB University ofrece un curso gratuito sobre cómo optimizar el rendimiento de MongoDB. Para obtener más información, consulte Monitoreo e información.

Volver

Rendimiento en tiempo real

En esta página