MongoDB proporciona una buena técnica que es la búsqueda de texto. Usando esta técnica podemos encontrar un fragmento de texto o una palabra específica de los campos de string. O, en otras palabras, MongoDB le permite realizar una operación de consulta para encontrar el texto especificado de la string. En MongoDB, podemos realizar búsquedas de texto utilizando el índice de texto y el operador $texto.
Índice de texto: MongoDB probó índices de texto que se utilizan para encontrar el texto especificado del contenido de la string. Los índices de texto deben ser una string o una array de elementos de string. Cuando realice una consulta de búsqueda de texto, recuerde siempre que su colección debe contener un índice de texto y una colección solo puede contener un índice de texto, pero este índice de texto único cubre varios campos. Podemos crear un índice de texto usando el método createIndex() .
Sintaxis:
db.nombreColección.createIndex( { campo: “texto” } )
Operador $texto: También puede buscar en el índice de texto utilizando el operador $texto. Este operador se utiliza para realizar operaciones de búsqueda de texto en la colección con un índice de texto. Este operador tokenizó cada string de búsqueda con espacios en blanco y trata la mayoría de los signos de puntuación como delimitadores excepto – y \”. Después de tokenizar la string de búsqueda, realiza una operación lógica OR en los tokens. Si desea ordenar los documentos resultantes, utilice el operador de consulta $meta.
Sintaxis:
$texto:
{
$buscar: <string>,
$idioma: <string>,
$sensible a mayúsculas y minúsculas: <booleano>,
$diacriticSensitive: <booleano>
}
¿Cómo buscar texto?
Usando los siguientes pasos podemos buscar texto en MongoDB:
Paso 1: Primero, creamos una colección y agregamos algunos documentos a la colección:
En el siguiente ejemplo, estamos trabajando con:
Base de datos: gfg
Colección: contenido
Documento: la colección de contenido contiene los tres documentos.
Paso 2: Crear índice:
Ahora creamos un índice de string en el campo de nombre y mascota con la ayuda del método createIndex(). Entonces podemos buscar texto sobre los campos de nombre y línea:
db.content.createIndex({name:"text",line:"text"})
Paso 3: Texto de búsqueda:
Ahora estamos listos para buscar texto. Por ejemplo, vamos a buscar en todos los documentos que contengan texto amor.
db.content.find({$text:{$search:"love"}})
Nota: $texto es un operador de consulta que realiza búsquedas de texto en una colección con un índice de texto.
Un ejemplo más en el que vamos a buscar en todos los documentos que contengan texto de perro:
db.content.find({$text:{$search:"dog"}})
¿Cómo buscar frases?
En lugar de buscar una sola palabra, también puede buscar una frase encerrándola entre comillas dobles («»). Generalmente, la búsqueda de frases realiza una operación OR entre las palabras clave especificadas. Por ejemplo, la frase es “Me gusta Mango”, luego la búsqueda por fases busca todos los documentos que contengan las palabras clave Me gusta, Me gusta o Mango. Y si desea realizar una búsqueda de frase exacta, ajuste la fase entre comillas dobles escapadas (\”).
Sintaxis:
Para la búsqueda de frases:
db.nombreColección.find({$texto:{$búsqueda:”Frase”}})
Para búsqueda de frase exacta:
db.nombreColección.find({$texto:{$buscar:”\”Frase”\”}})
Ejemplos:
En los siguientes ejemplos, estamos trabajando con:
Base de datos: gfg
Colección: contenido
Documento: la colección de contenido contiene los tres documentos.
- Encuentra la frase:
db.content.find({$text:{$search:"I love dogs"}})
Aquí buscamos la frase “I love dogs”. Entonces, en el resultado, obtenemos todos los documentos que contienen las palabras clave Yo, amo o perros.
- Encuentra la frase exacta:
db.content.find({$text:{$search:"\"I love dogs\""}})
Aquí, buscamos la frase exacta envolviendo la fase entre comillas dobles escapadas (\»). Es decir, «\»Me encantan los perros\»». Entonces, en el resultado, solo obtenemos aquellos documentos que contienen la frase exacta especificada.
¿Cómo excluir un término de la búsqueda?
Exclusión de término significa cuando realiza una operación de búsqueda y no desea mostrar el documento que contiene el término especificado, por lo que puede excluir el término anteponiendo una palabra clave de búsqueda con el signo menos (-). Con el signo menos (-) puede excluir todos los documentos que contienen el término de exclusión. Por ejemplo, desea mostrar todos los documentos que contienen la palabra clave «Automóvil», pero no la palabra clave «Ciclo», por lo que puede utilizar la siguiente consulta:
dn.collectionName.find({$text:{$search:"Car -Cycle"}})
Por ejemplo:
En el siguiente ejemplo, estamos trabajando con:
Base de datos: gfg
Colección: contenido
Documento: la colección de contenido contiene los tres documentos.
db.content.find({$text:{$search:"dog -cow"}})
Aquí, solo mostramos aquellos documentos que contienen perro, no vaca.
Buscar texto mediante canalización de agregación
Podemos buscar texto usando la canalización de agregación con la ayuda del operador de consulta $text en la etapa $match . Pero existen algunas restricciones para usar el operador $texto :
- La primera etapa de la canalización debe ser la etapa $match que contiene el operador $text .
- Solo una vez en el escenario ocurrirá un operador de texto.
- La expresión del operador de texto no puede aparecer en expresiones de $or o $not .
- De forma predeterminada, la búsqueda de texto no devuelve documentos coincidentes en el orden de las puntuaciones coincidentes. Si desea ordenar en puntuación descendente, utilice la expresión de agregación $meta en la etapa $sort.
Nota: La puntuación de texto es una puntuación que el operador $text asigna a cada documento que contiene el término de búsqueda en el campo de índice. La puntuación refleja la importancia de un documento para una consulta de búsqueda de texto determinada.
Ejemplo:
En el siguiente ejemplo, estamos trabajando con:
Base de datos: gfg
colección: personas
Documento: La colección de personas contiene los cinco documentos.
- Cuente el número del documento en el que el valor de la mascota es un gato:
db.people.aggregate([{$match:{$text:{$search:"Cat"}}}, {$group:{_id:null,total:{$sum:1}}}])
- Cuente el número del documento en el que el valor de la mascota es un perro:
db.people.aggregate([{$match:{$text:{$search:"Dog"}}}, {$group:{_id:null,total:{$sum:1}}}])
- Devuelve el resultado Ordenado usando la puntuación de texto:
db.people.aggregate([{$match:{$text:{$search:"Dog"}}}, {$sort:{score:{$meta:"textScore"}}}, {$project:{_id:0,name:1}}])
Aquí, devolvemos el resultado (todos los documentos que contienen el texto especificado, es decir, «Perro») en forma ordenada usando textScore.
Publicación traducida automáticamente
Artículo escrito por nikhilchhipa9 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA