Estoy siguiendo las instrucciones del tutorial: https://docs.mongodb.com/manual/core/index-text/
Estos son los datos de muestra:
db.stores.insert( [ { _id: 1, name: "Java Hut", description: "Coffee and cakes" }, { _id: 2, name: "Burger Buns", description: "Gourmet hamburgers" }, { _id: 3, name: "Coffee Shop", description: "Just coffee" }, { _id: 4, name: "Clothes Clothes Clothes", description: "Discount clothing" }, { _id: 5, name: "Java Shopping", description: "Indonesian goods" } ] ) Caso 1: db.stores.find( { $text: { $search: "java coffee shop" } } ) => ENCONTRADO
Caso 2: db.stores.find( { $text: { $search: "java" } } ) => ENCONTRADO
Caso 3: db.stores.find( { $text: { $search: "coff" } } ) => NO ENCONTRADO
Espero que se ENCUENTRE el caso 3 porque la consulta coincide con una parte de java coffee shop
El caso 3 no funcionará con el operador $texto y la razón es cómo Mongo crea índices de texto.
Mongo toma valores de campos indexados de texto y crea índices separados para cada palabra única en cadena y no carácter (!).
entonces esto significa que en su caso para 1 objeto:
el nombre del campo tendrá 2 índices:
la descripción del campo tendrá 3 índices:
El operador de $texto compara los valores de $búsqueda con estos índices y es por eso que "coff" no funcionará.
Si desea aprovechar las ventajas de los índices, debe usar el operador $text, pero no le brinda toda la flexibilidad, tal como lo desea.
solución :
Simplemente puede usar $regex con la opción de distinción entre mayúsculas y minúsculas (i) y optimizar su consulta con omitir y limitar.
Si desea devolver todos los documentos y la colección es grande, $regex causará un problema de rendimiento
también puede consultar este artículo https://medium.com/coding-in-depth/full-text-search-part-1-how-to-create-mongodb-full-and-partial-text-search-c09c0bae17a3 y tal vez use índices comodín para eso, pero no sé si es una buena práctica o no.