Búsquedas de texto con Amazon DocumentDB - Amazon DocumentDB

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Búsquedas de texto con Amazon DocumentDB

La característica de búsqueda de texto completo nativo de Amazon DocumentDB le permite hacer búsquedas de texto en conjuntos de datos textuales de gran tamaño mediante índices de texto especiales. En esta sección se describen las funcionalidades de la característica de índice de texto y se proporcionan los pasos para crear y utilizar índices de texto en Amazon DocumentDB. También se enumeran las limitaciones de la búsqueda de texto.

Funcionalidades admitidas

La búsqueda de texto de Amazon DocumentDB admite las siguientes funcionalidades compatibles con la API de MongoDB:

  • Cree índices de texto en un solo campo.

  • Cree índices de texto compuestos que incluyan más de un campo de texto.

  • Haga búsquedas de una o varias palabras.

  • Controle los resultados de la búsqueda mediante ponderaciones.

  • Ordene los resultados de la búsqueda por puntuación.

  • Usa el índice de texto en la canalización de agregación.

  • Busque la frase exacta.

Para crear un índice de texto en un campo que contenga datos de cadena, especifique la cadena “texto” como se muestra a continuación:

Índice de campo único:

db.test.createIndex({"comments": "text"})

Este índice admite consultas de búsqueda de texto en el campo de cadena de “comentarios” de la colección especificada.

Cree un índice de texto compuesto en más de un campo de cadena:

db.test.createIndex({"comments": "text", "title":"text"})

Este índice admite consultas de búsqueda de texto en los campos de cadena de “comentarios” y “título” de la colección especificada. Puede especificar hasta 30 campos al crear un índice de texto compuesto. Una vez creadas, las consultas de búsqueda de texto consultarán todos los campos indexados.

nota

Solo se permite un índice de texto en cada colección.

Visualización de un índice de texto en una colección de Amazon DocumentDB

Puede utilizar getIndexes() en su colección para identificar y describir índices, incluidos los índices de texto, como se muestra en el siguiente ejemplo:

rs0:PRIMARY> db.test.getIndexes() [ { "v" : 4, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "test.test" }, { "v" : 1, "key" : { "_fts" : "text", "_ftsx" : 1 }, "name" : "contents_text", "ns" : "test.test", "default_language" : "english", "weights" : { "comments" : 1 }, "textIndexVersion" : 1 } ]

Una vez que haya creado un índice, empiece a insertar datos en su colección de Amazon DocumentDB.

db.test.insertMany([{"_id": 1, "star_rating": 4, "comments": "apple is red"}, {"_id": 2, "star_rating": 5, "comments": "pie is delicious"}, {"_id": 3, "star_rating": 3, "comments": "apples, oranges - healthy fruit"}, {"_id": 4, "star_rating": 2, "comments": "bake the apple pie in the oven"}, {"_id": 5, "star_rating": 5, "comments": "interesting couch"}, {"_id": 6, "star_rating": 5, "comments": "interested in couch for sale, year 2022"}])

Ejecución de consultas de búsqueda de texto

Ejecute una consulta de búsqueda de texto de una sola palabra

Necesitará utilizar los operadores $text y $search para hacer búsquedas de texto. El ejemplo siguiente devuelve todos los documentos en los que el campo indexado de texto contiene la cadena “manzana” o “manzana” en otros formatos, como “manzanas”:

db.test.find({$text: {$search: "apple"}})

Salida:

La salida de este comando tendrá un aspecto similar al siguiente:

{ "_id" : 1, "star_rating" : 4, "comments" : "apple is red" } { "_id" : 3, "star_rating" : 3, "comments" : "apples, oranges - healthy fruit" } { "_id" : 4, "star_rating" : 2, "comments" : "bake the apple pie in the oven" }

Ejecución de una búsqueda de texto de varias palabras

También puede hacer búsquedas de texto de varias palabras en sus datos de Amazon DocumentDB. El siguiente comando devuelve documentos con un campo de texto indexado que contiene las palabras “manzana” o “tarta”:

db.test.find({$text: {$search: "apple pie"}})

Salida:

La salida de este comando tendrá un aspecto similar al siguiente:

{ "_id" : 1, "star_rating" : 4, "comments" : "apple is red" } { "_id" : 2, "star_rating" : 5, "comments" : "pie is delicious" } { "_id" : 3, "star_rating" : 3, "comments" : "apples, oranges - healthy fruit" } { "_id" : 4, "star_rating" : 2, "comments" : "bake the apple pie in the oven" }

Ejecución de una búsqueda de texto con frases de varias palabras

Para una búsqueda de frases de varias palabras, utilice este ejemplo:

db.test.find({$text: {$search: "\"apple pie\""}})

Salida:

El comando anterior devuelve documentos con un campo de texto indexado que contiene la frase exacta “tarta de manzana”. La salida de este comando tendrá un aspecto similar al siguiente:

{ "_id" : 4, "star_rating" : 2, "comments" : "bake the apple pie in the oven" }

Ejecución de una búsqueda de texto con filtros

También puede combinar la búsqueda de texto con otros operadores de consulta para filtrar los resultados en función de criterios adicionales:

db.test.find({$and: [{star_rating: 5}, {$text: {$search: "interest"}}]})

Salida:

El comando anterior devuelve los documentos con un campo de texto indexado que contiene cualquier forma de “interés” y una “calificación_por_estrellas” igual a 5. La salida de este comando tendrá un aspecto similar al siguiente:

{ "_id" : 5, "star_rating" : 5, "comments" : "interesting couch" } { "_id" : 6, "star_rating" : 5, "comments" : "interested in couch for sale, year 2022" }

Limitación del número de documentos devueltos en una búsqueda de texto

Puede optar por restringir el número de documentos devueltos mediante limit:

db.test.find({$and: [{star_rating: 5}, {$text: {$search: "couch"}}]}).limit(1)

Salida:

El comando anterior devuelve un resultado que cumple con el filtro:

{ "_id" : 5, "star_rating" : 5, "comments" : "interesting couch" }

Ordenación de los resultados por puntuación de texto

En el siguiente ejemplo, se ordenan los resultados de la búsqueda de texto por puntuación de texto:

db.test.find({$text: {$search: "apple"}}, {score: {$meta: "textScore"}}).sort({score: {$meta: "textScore"}})

Salida:

El comando anterior devuelve los documentos con un campo de texto indexado que contiene la palabra “manzana” o “manzana” en otros formatos, como “manzanas”, y ordena el resultado en función de la relación del documento con el término de búsqueda. La salida de este comando tendrá un aspecto similar al siguiente:

{ "_id" : 1, "star_rating" : 4, "comments" : "apple is red", "score" : 0.6079270860936958 } { "_id" : 3, "star_rating" : 3, "comments" : "apples, oranges - healthy fruit", "score" : 0.6079270860936958 } { "_id" : 4, "star_rating" : 2, "comments" : "bake the apple pie in the oven", "score" : 0.6079270860936958 }

$text y $search también son compatibles con los comandos aggregate, count, findAndModify, update y delete.

Operadores de agregación

Canalización de agregación mediante $match

db.test.aggregate( [{ $match: { $text: { $search: "apple pie" } } }] )

Salida:

El comando anterior devuelve los siguientes resultados:

{ "_id" : 1, "star_rating" : 4, "comments" : "apple is red" } { "_id" : 3, "star_rating" : 3, "comments" : "apple - a healthy fruit" } { "_id" : 4, "star_rating" : 2, "comments" : "bake the apple pie in the oven" } { "_id" : 2, "star_rating" : 5, "comments" : "pie is delicious" }

Una combinación de otros operadores de agregación

db.test.aggregate( [ { $match: { $text: { $search: "apple pie" } } }, { $sort: { score: { $meta: "textScore" } } }, { $project: { score: { $meta: "textScore" } } } ] )

Salida:

El comando anterior devuelve los siguientes resultados:

{ "_id" : 4, "score" : 0.6079270860936958 } { "_id" : 1, "score" : 0.3039635430468479 } { "_id" : 2, "score" : 0.3039635430468479 } { "_id" : 3, "score" : 0.3039635430468479 }

Especifique varios campos al crear un índice de texto

Puede asignar ponderaciones a un máximo de tres campos del índice de texto compuesto. La ponderación predeterminada asignada a un campo en un índice de texto es uno (1). La ponderación es un parámetro opcional y debe estar en el rango de 1 a 100 000.

db.test.createIndex( { "firstname": "text", "lastname": "text", ... }, { weights: { "firstname": 5, "lastname":10, ... }, name: "name_text_index" } )

Diferencias con MongoDB

La característica de índice de texto de Amazon DocumentDB utiliza un índice invertido con un algoritmo de frecuencia de términos. Los índices de texto son dispersos de forma predeterminada. Debido a las diferencias en la lógica de análisis, los delimitadores de tokenización y otros, es posible que no se devuelva el mismo conjunto de resultados que MongoDB para el mismo conjunto de datos o forma de consulta.

Existen las siguientes diferencias adicionales entre el índice de texto de Amazon DocumentDB y MongoDB:

  • No se admiten los índices compuestos que utilizan índices que no sean de texto.

  • Los índices de texto de Amazon DocumentDB no distinguen entre mayúsculas y minúsculas ni entre diacríticos.

  • Solo se admite el idioma inglés con el índice de texto.

  • No se admite la indexación de texto de campos matriciales (o de varias claves). Por ejemplo, no se podrá crear un índice de texto en “a” con el documento {“a”: [“manzana”, “tarta”]}.

  • No se admite la indexación de texto con caracteres comodín.

  • No se admiten índices de texto únicos.

  • No se admite la exclusión de un término.

Prácticas recomendadas y directrices

  • Para obtener un rendimiento óptimo en las consultas de búsqueda de texto que implican ordenar por puntuaciones de texto, se recomienda crear el índice de texto antes de cargar los datos.

  • Los índices de texto requieren almacenamiento adicional para poder disponer de una copia interna optimizada de los datos indexados. Esto tiene implicaciones de costos adicionales.

Limitaciones

La búsqueda de texto tiene las siguientes limitaciones en Amazon DocumentDB:

  • La búsqueda de texto se admite en los clústeres basados en instancias de Amazon DocumentDB 5.0.