Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
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 etapa del pipeline de agregación, puedes modificar estas consultas para usar $search en lugar de mejorar tanto la flexibilidad como el rendimiento de estas consultas.

La etapa de agregación $search proporciona las siguientes funcionalidades que no están disponibles a través del operador $text, están disponibles pero con menor desempeño, o solo están disponibles con un trabajo de implementación significativo por parte del usuario:

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

Text Index
índice de MongoDB Search
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 campos genres y plot como texto, y el campo year 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 MongoDB Search, consulte Cree un índice de MongoDB Search.

Puedes actualizar tus consultas basadas en $textpara usar $search y aumentar así la flexibilidad y comodidad. En este ejemplo, consultarás la sample_mflix.movies colección en los datos de muestra para recuperar entradas con la palabra "poeta" en el campo plot, ordenadas en orden ascendente por año.

Las definiciones de índices expuestas en la sección anterior ilustran uno de los mejoras relacionados de $search. Para crear el índice $text en sample_mflix.movies, primero debes borrar cualquier índice de texto existente en los datos de muestra utilizando el método db.collection.dropIndex(), ya que MongoDB solo admite un único índice de texto por colección.

Por el contrario, puedes crear varios índices de búsqueda de MongoDB para una sola colección, lo que permite a tus aplicaciones aprovechar 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 MongoDB Search
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
}

Exclusivo de MongoDB Search, puede añadir resaltados a los resultados, mostrando las coincidencias en los contextos en los que se encontraron. Para ello, sustituya la MongoDB Search query 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 ofrecer mayor flexibilidad y comodidad, MongoDB Search proporciona ventajas de rendimiento significativas sobre las $text queries análogas. Considera una query contra la colección sample_mflix.movies para recuperar películas publicadas entre 2000 y 2010, en el género de comedia, con 'poet' en el campo plot.

Ejecuta las siguientes consultas:

Text Index
índice de MongoDB Search
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 $text es adecuado para búsquedas simples y estrechas como esta, a medida que el tamaño de los conjuntos de datos y la amplitud de tus queries aumentan, las ventajas de rendimiento de $search mejorarán significativamente la capacidad de respuesta de tus aplicaciones. Recomendamos que utilices una query de MongoDB Search en la etapa del pipeline de agregación $search.

Volver

Rendimiento en tiempo real

En esta página