Necesito encontrar todos los documentos en una base de datos MongoDB que tengan una propiedad que contenga una cadena que sea similar al término de búsqueda pero que permita un cierto % de divergencia.
En javascript simple, podría, por ejemplo, usar https://www.npmjs.com/package/string-similarity y luego, básicamente, hacer coincidir todos los documentos que tienen una puntuación de similitud> 90%.
Me gustaría hacer esto como una consulta MongoDB y tener el mayor rendimiento posible ya que la base de datos contiene millones de documentos.
¿Qué posibles opciones tengo en esta situación?
Estoy muy feliz por cada idea para resolver esto de la mejor manera posible.
La solución común a este problema es usar una base de datos de un motor de búsqueda, como Elasticsearch
o Atlas search
(del equipo de Mongodb). No entraré en demasiados detalles sobre cómo funcionan estas bases de datos, pero en términos generales son una base de datos de índice inverso, esto significa que usted tokeniza sus datos al insertarlos y luego sus consultas se ejecutan en los datos tokenizados y no en el conjunto de datos sin procesar.
Este enfoque es muy poderoso y puede ayudar con muchos problemas de "motor de búsqueda", como el autocompletado o, en su caso, lo que se llama una búsqueda "difusa".
Veamos cómo maneja elasticsearch esto leyendo acerca de su característica difusa :
Para encontrar términos similares, la consulta aproximada crea un conjunto de todas las variaciones o expansiones posibles del término de búsqueda dentro de una distancia de edición especificada. A continuación, la consulta devuelve coincidencias exactas para cada expansión.
Básicamente, lo que hacen es crear todas las permutaciones "posibles" de la consulta dentro de los parámetros dados. Personalmente, recomendaría que solo use una de estas bases de datos que brindan esta capacidad OOTB, sin embargo, si desea hacer un "pseudo" motor de búsqueda en Mongo, puede usar este enfoque (con la desventaja de que los índices de Mongo son un árbol, por lo que fuerza un análisis de árbol para estas consultas en lugar de una base de datos diseñada para esto)