Búsqueda de texto de MongoDB Y múltiples palabras de búsqueda

Tengo un índice en una matriz de “claves” que estoy usando para proporcionar funcionalidad de texto completo a mi aplicación.

Con el lanzamiento de 2.4.3, me gustaría utilizar el tipo de índice “texto”. Aseguré un tipo de índice de “texto” en las “claves” de mi matriz y parece funcionar SUPER rápido (más rápido que mi antiguo método de palabras clave de texto completo).

El problema es que mi aplicación asume que los campos son inclusivos (Y). Por defecto, la búsqueda de texto O mis parámetros.

¿Alguien sabe de una forma de ejecutar una búsqueda de texto de manera inclusiva?

Por ejemplo:

db.supplies.runCommand("text", {search:"printer ink"}) 

debería devolver resultados con impresora y tinta, en lugar de todos los resultados con impresora o tinta.

Prueba a:

 db.supplies.runCommand("text", {search:"\"printer\" \"ink\""}) 

Además, aquí hay una cita de documentos :

Si la cadena de búsqueda incluye frases, la búsqueda realiza un AND con cualquier otro término en la cadena de búsqueda; por ejemplo, buscar “\” twinkle twinkle \ “little star” busca “twinkle twinkle” y (“little” o “star”).

Espero que ayude.

Puede ajustar cada palabra entre comillas dobles:

 let keywords = ctx.params.query.split(/\s+/).map(kw => `"${kw}"`).join(' '); match.$text = { $search: keywords, $caseSensitive: false }; 

Hay una desventaja si el usuario ingresa una cadena entre comillas, esto no funcionará. Tendría que analizar primero las cadenas entre comillas.

Aquí hay una función simple que hice para buscar usando subwords en el nodo. Espero que ayude a alguien

Supongamos que un usuario busca pri nks para que satisfaga las necesidades de la impresora y las tintas, pero $ text search no permite esto, así que aquí está mi simple función:

  var makeTextFilter = (text) => { var wordSplited = text.split(/\s+/); /** Regex generation for words */ var regToMatch = new RegExp(wordSplited.join("|"), 'gi'); let filter = []; searchFieldArray.map((item,i) => { filter.push({}); filter[i][item] = { $regex: regToMatch, $options: 'i' } }) return filter; } 

y úsala en tu consulta como esta

 let query = {...query, $or: makeTextFilter(textInputFromUser)} tableName.find(query, function (err, cargo_list)