Consejos Tecnológicos

¿Cómo utilizar la búsqueda de texto en Mongodb?

MongoDB es una de las principales bases de datos NoSQL, conocida por su estructura rápida y universal, escalabilidad y excelentes capacidades de indexación. Antes de entrar en detalles, veamos el panorama general. Al localizar contenido en Internet, la búsqueda de texto completo es una característica imprescindible. Cuando vemos material que utiliza frases o palabras clave, el mejor ejemplo es la búsqueda de Google. En este artículo, aprenderemos sobre la función de búsqueda de texto completo de MongoDB basada en la indexación de texto.

MongoDB introdujo una función experimental por primera vez en la versión 2.4, lo que permite la búsqueda de texto completo a través del índice de texto. Esta función es ahora un elemento esencial del producto (ya no es una función experimental). En este artículo, presentaremos los conceptos básicos de la función de búsqueda de texto completo de MongoDB.

Buscar texto: una función básica

Considere una búsqueda normal de Google para comprender mejor el concepto de búsqueda de texto completo. Cuando usamos Google para buscar contenido, ingresamos una cadena de texto, cadenas, frases o palabras clave y devolvemos algunos resultados. La búsqueda de texto completo en MongoDB le permite ejecutar consultas complejas equivalentes a las que se ejecutan mediante motores de búsqueda. Puede buscar frases y variaciones de la raíz de una palabra, y puede eliminar palabras «negativas» específicas de los resultados de búsqueda.

Puede utilizar la búsqueda de texto completo de MongoDB para crear un índice de texto en cualquier campo del documento cuyo valor sea una cadena o una matriz de cadenas. Cuando construimos un índice de texto en un campo, MongoDB marca y deriva el contenido de texto del campo de índice y crea el índice en consecuencia.

Aquí hay algunas otras situaciones en las que podríamos ver la búsqueda de texto completo:

  • Considere buscar temas que le gusten en la Wiki. Cuando ingresa un término de búsqueda en la Wiki, el motor de búsqueda devolverá resultados para todos los artículos que contienen las palabras clave / frases que ingresó (incluso si estas palabras clave se utilizan en lo profundo del artículo). La relevancia de estos resultados de búsqueda está determinada por sus puntuaciones coincidentes.
  • Considere un sitio de redes sociales donde los usuarios pueden buscar para encontrar todas las publicaciones que contienen el término «gato» o, más específicamente, todas las publicaciones que contienen la palabra gato en sus comentarios.

Establecer búsqueda

Ahora veamos algunos ejemplos prácticos que nos ayudarán a comprender mejor las cosas. Espero que me sigan para ejecutar los ejemplos en el shell mongo. Primero crearemos algunos datos de muestra que usaremos a lo largo del tutorial, y luego discutiremos las ideas clave.

Primero, conéctese a su servidor MongoDB:

Después de instalar MongoDB en su sistema, puede usar el shell mongo para conectarse al servidor MongoDB.

Atropellar Mongo El comando inicia el shell MongoDB desde su símbolo del sistema.esta Mongo De forma predeterminada, el comando inicia un shell que está vinculado a una instancia de MongoDB instalada localmente que se ejecuta en el puerto 27017.

Ejecute el comando mongo sin ningún otro parámetro:

>mongo

Esto generará un mensaje de bienvenida con información sobre el servidor al que está conectado el shell y la versión de MongoDB instalada.

Felicitaciones, estás en el caparazón de Mongo.

Ahora ejecute el siguiente comando:

>use message

Insertemos algunos documentos usando la siguiente declaración.

db.message.insert("subject":"Ishan is having a dog", "content":"Dogs are most loyal pet", "likes": 60, "year":2015, "language":"english")

db.message.insert("subject":"Dogs eat cats", "content":"Cats are not evil", "likes": 30, "year":2015, "language":"english")

db.message.insert("subject":"Cats eat rats", "content":"Rats like cheese", "likes": 55, "year":2014, "language":"english")

Crear índice

Para realizar una búsqueda de texto, primero debemos construir un índice de texto en el campo. Esto se puede hacer en uno o varios campos. La siguiente declaración generará un índice de texto en un solo campo.

>db.message.createIndex("subject":"text")

Insertemos algunos documentos usando la siguiente declaración.

db.message.insert("subject":"Ishan is having a dog", "content":"Dogs are most loyal pet", "likes": 60, "year":2015, "language":"english")

db.message.insert("subject":"Dogs eat cats", "content":"Cats are not evil", "likes": 30, "year":2015, "language":"english")

db.message.insert("subject":"Cats eat rats", "content":"Rats like cheese", "likes": 55, "year":2014, "language":"english")

Crear índice

Para realizar una búsqueda de texto, primero debemos construir un índice de texto en el campo. Esto se puede hacer en uno o varios campos. La siguiente declaración generará un índice de texto en un solo campo.

>db.message.createIndex("subject":"text")

Generaremos un índice de texto basado en la descripción y los atributos de los subtítulos. En MongoDB, solo podemos crear un índice de texto para cada colección. Por lo tanto, usando las siguientes líneas, construiremos un índice de texto compuesto.

db.messages.createIndex("subject":"text","content":"text")

Utilice el operador $ text

El operador $ text también se puede utilizar para buscar en el índice de texto. Este operador se utiliza para realizar operaciones de búsqueda de texto en la colección de índices de texto. Este operador marca cada cadena de búsqueda con espacios y trata la mayoría de los signos de puntuación como delimitadores, con la excepción de – y . «Realiza una operación lógica OR en las etiquetas después de etiquetar la frase de búsqueda. Los documentos generados se ordenan usando el operador $ meta query.

Syntax: 
$text: 
 
     $search: <string>, 
     $language: <string>, 
     $caseSensitive: <boolean>, 
     $diacriticSensitive: <boolean> 

$ Campo de búsqueda

Ahora intentaremos buscar documentos con la palabra clave «perro» en los cuadros de asunto y contenido. Podemos usar la siguiente declaración para lograr esto.

> db.message.find($text: $search: "dog")

ejemplo:

> db.message.find($text: $search: "dog", subject: 1, content:1) 
This will give the output as:   
 "_id" : ObjectId("6176ce6de02fd70a168ad9c6"), "subject" : "Ishan is having a dog", "content" : "Dogs are most loyal pet"  
 "_id" : ObjectId("6176ce77e02fd70a168ad9c7"), "subject" : "Dogs eat cats", "content" : "Cats are not evil" 

Ordenar documentos según la relevancia de la búsqueda

Puntuación de texto

Cada página que contiene la frase de búsqueda en el campo de índice recibe una puntuación del operador $ text. La puntuación muestra la relevancia del documento para una consulta de búsqueda de texto específica. La puntuación se puede especificar como parte de la definición del método sort () y la expresión de proyección. $ meta: La expresión «textScore» proporciona información sobre el procesamiento de la operación $ text. Para obtener más información sobre cómo recuperar proyecciones u ordenar puntuaciones, consulte el operador de proyección $ meta.

Estamos haciendo una búsqueda de texto, por lo que nos gustaría recibir algunas estadísticas sobre la relevancia de los documentos resultantes. Para ello, usaremos la expresión $ meta: «textScore», que proporciona información sobre el procesamiento del operador $ text. Usando el comando sort, también ordenaremos los documentos por textScore. Un textScore más grande indica una mejor coincidencia.

db.messages.find($text: $search: "dogs", score: $meta: "textScore").sort(score:$meta:"textScore")

Esta consulta devuelve los siguientes documentos:

 "_id" : ObjectId("6176b68b750fd1447889f942"), "subject" : "Joe owns a dog", "content" : "Dogs are man's best friend", "likes" : 60, "year" : 2015, "language" : "english", "score" : 1.2916666666666665  

 "_id" : ObjectId("6176b69f750fd1447889f943"), "subject" : "Dogs eat cats and dog eats pigeons too", "content" : "Cats are not evil", "likes" : 30, "year" : 2015, "language" : "english", "score" : 1 

Como puede ver, el primer documento tiene una puntuación de 1,2916666666666665 (porque la palabra clave perro aparece dos veces en su asunto) y el segundo documento tiene una puntuación de 1. La consulta también ordena los documentos devueltos en orden descendente.

Índice compuesto:

En nuestro ejemplo, permitiremos la indexación de texto compuesto de campos temáticos y de contenido. Continúe ejecutando los siguientes comandos en el shell mongo:

db.messages.createIndex("subject":"text","content":"text")

Este comando no funcionará. Si intenta crear un segundo índice de texto, aparecerá un mensaje de error que indica que el índice de búsqueda de texto completo ya existe. ¿Por qué está pasando esto? La explicación es que el índice de texto está limitado a un índice de texto por colección. Por lo tanto, si desea crear otro índice de texto, debe eliminar el índice anterior y crear un índice nuevo.

db.messages.dropIndex("subject_text")  
db.messages.createIndex("subject":"text","content":"text")

Después de ejecutar la consulta de creación de índice mencionada anteriormente, intente buscar en todas las páginas utilizando la palabra clave cat.

db.messages.find($text: $search: "cat", score: $meta: "textScore").sort(score:$meta:"textScore")

La consulta anterior dará el siguiente resultado:

 "_id" : ObjectId("6176b69f750fd1447889f943"), "subject" : "Dogs eat cats and dog eats pigeons too", "content" : "Cats are not evil", "likes" : 30, "year" : 2015, "language" : "english", "score" : 1.3333333333333335 

 "_id" : ObjectId("6176b6cb750fd1447889f944"), "subject" : "Cats eat rats", "content" : "Rats do not cook food", "likes" : 55, "year" : 2014, "language" : "english", "score" : 0.6666666666666666 

Indexar todo el documento

En el ejemplo anterior, creamos un índice compuesto en los campos de materia y contenido. Sin embargo, a veces es posible que desee que se pueda realizar búsquedas en cualquier texto del documento.

Por ejemplo, considere almacenar correos electrónicos en documentos MongoDB. Para el correo electrónico, todos los campos deben poder buscarse, incluido el remitente, el destinatario, el asunto y el cuerpo. En este caso, puede utilizar el especificador comodín $ ** para indexar todos los campos de cadena del documento.

La consulta es la siguiente (asegúrese de eliminar el índice existente antes de crear un nuevo índice):

db.messages.createIndex("$**":"text")

Esta consulta creará un índice de texto en cualquier campo de cadena en nuestro documento.

Implemente la búsqueda de texto en la canalización de agregación:

Admite la búsqueda de texto en la canalización de agregación a través del operador de consulta $ text en la etapa $ match.

Sin embargo, las siguientes reglas se aplican a las búsquedas de texto en la canalización de agregación:

  • La etapa inicial de la canalización debe ser la etapa $ match con $ text.
  • En el escenario, el operador $ text solo puede aparecer una vez.
  • La expresión del operador $ text no está permitida en la expresión $ or o $ not.
  • De forma predeterminada, la búsqueda de texto no devolverá documentos coincidentes en el orden de puntajes coincidentes. En la etapa $ sort, use la expresión $ meta agregación para ordenar en orden descendente.

El operador $ text asigna una puntuación de texto a cada documento que contiene un término de búsqueda en el campo de índice. Esta puntuación muestra la importancia del documento en relación con una consulta de búsqueda de texto determinada.

ejemplo:

El siguiente ejemplo se basa en información Una colección con un índice de texto sobre el tema del campo:

>use people 
> db.people.insert("name":"Ishan","pet":"dog") 
> db.people.insert("name":"Abhresh","pet":"cat") 
> db.people.insert("name":"Madan","pet":"cat") 
> db.people.insert("name":"Sneha","pet":"dog")

>db.people.find().pretty()

Cuente el número de documentos cuyo valor como mascota es perro:

db.people.aggregate([$match:$text:$search:"dog",$group:_id:null,total:$sum:1])

Cuente la cantidad de documentos cuyo valor como mascota es Gato:

db.people.aggregate([$match:$text:$search:"dog",$group:_id:null,total:$sum:1])

Generalizar

Si está tratando con contenido de cadena en MongoDB, debe usar la búsqueda de texto completo para que su búsqueda sea más efectiva y precisa. En este artículo, demostramos cómo realizar una búsqueda básica de texto completo en un conjunto de datos de muestra.

La búsqueda de texto completo siempre ha sido una de las funciones más necesarias de MongoDB. Este artículo primero presenta la búsqueda de texto completo y luego presenta los conceptos básicos de la generación de índices de texto.

Después de eso, estudiamos el índice compuesto y el índice comodín. También estudiamos algunos conceptos clave, incluida la indexación de texto analítico y la búsqueda de texto en canalizaciones de agregación. En la próxima versión de MongoDB, podemos esperar algunas mejoras importantes en esta función.

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba