Realizar 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.

Realizar búsquedas de texto con Amazon DocumentDB

La función de búsqueda de texto completo nativa de Amazon DocumentDB le permite realizar 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 función 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 compatibles

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.

  • Realice búsquedas de una o varias palabras.

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

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

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

  • Busca 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 cadenas «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.

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

Puede utilizarlos 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, comience 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"}])

Ejecutar consultas de búsqueda de texto

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

Necesitará utilizar los $search operadores $text y para realizar 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:

El resultado de este comando tiene 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" }

Ejecute una búsqueda de texto de varias palabras

También puede realizar 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:

El resultado de este comando tiene 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" }

Ejecute 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». El resultado de este comando tiene un aspecto similar al siguiente:

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

Ejecuta 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. El resultado de este comando tiene 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" }

Limite el número de documentos devueltos en una búsqueda de texto

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

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" }

Ordena 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. El resultado de este comando tiene 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 }

$texty también $search son compatibles con los delete comandos aggregate countfindAndModify,update,, y.

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. El peso predeterminado asignado a un campo en un índice de texto es uno (1). El peso es un parámetro opcional y debe estar en el rango de 1 a 100000.

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

Diferencias con MongoDB

La función 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.

  • El índice de texto solo admite el idioma inglés.

  • 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»: [«apple», «pie»]}.

  • 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.

Mejores prácticas y directrices

  • Para obtener un rendimiento óptimo en las consultas de búsqueda de texto que implican la clasificación por puntuaciones de texto, le recomendamos que cree 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 costes adicionales.

Limitaciones

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

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