mongodb text index
Búsqueda de texto completo con peso en mangosta (4)
Como descubrí, desde la versión 3.8.9, mongoose admite la búsqueda de texto completo. ¡Pero no puedo encontrar una buena documentación para eso!
Quiero hacer algo como:
db.collection.ensureIndex(
// Fields to index
{
animal: "text",
color: "text",
pattern: "text",
size: "text"
},
// Options
{
name: "best_match_index",
// Adjust field weights (default is 1)
weights: {
animal: 5, // Most relevant search field
size: 4 // Also relevant
}
}
)
¿Puedo hacerlo con mangosta pura? O tengo que usar algún plugin como mongoose-text-search ? ¿Qué tal sin peso?
¿Y cómo debería hacerlo?
A partir de MongoDB 2.6, una colección puede tener como máximo un índice de texto (documentado here ). Por lo tanto, no podrá hacer lo que quiera con la versión actual de MongoDB. Realmente, para problemas de búsqueda de texto complicados con requisitos de diferentes pesos según la ubicación de la coincidencia, debe considerar una solución de búsqueda de texto en toda regla, como Solr o ElasticSearch.
Como solución alternativa en MongoDB, puede tokenizar manualmente los campos, almacenarlos como matrices de palabras clave e indexarlos:
animal: ["The", "quick", "brown", "fox", "jump", ..., "dog"]
entonces una consulta como
db.test.find ({animal: {$ en: ["marrón", "zapatos"]})
imita la búsqueda de texto. Hay algunas limitaciones de este enfoque, como el trabajo manual requerido para configurarlo, el hecho de que no habrá derivaciones, por ejemplo, unir "soñar" con "sueño", el hecho de que las palabras vacías no se eliminarán como en un índice de texto normal, y la ausencia de cualquier mecanismo de ponderación.
Encontré el siguiente artículo que me llevó a http://code.tutsplus.com/tutorials/full-text-search-in-mongodb--cms-24835 Dejé caer el índice creado en la respuesta superior usando la siguiente
db.tablename.dropIndex({"indexname_text"})
Obtuve la lista de índices con este comando
db.tablename.getIndexes()
Luego usé lo siguiente para crear los índices
db.tablename.createIndex({"$**":"text"})
los siguientes comandos funcionaron en Mongoose
model.find(
{$text: {$search: "text you are searching for"}},
{score: {$meta: "textScore"}})
.sort({score:{$meta:"textScore"}}
)
.exec(function(err, results) {
`enter code here`if(!err){
console.log(''results '' + results);
}
else
{
console.log(err);
}
});
Sí, puedes usar la búsqueda de texto completo en Mongoose> = 3.8.9. En primer lugar, una colección puede tener como máximo un índice de texto (ver docs ). Por lo tanto, para definir el índice de texto para varios campos , necesita un índice compuesto:
schema.index({ animal: ''text'', color: ''text'', pattern: ''text'', size: ''text'' });
Ahora puedes usar $ text query operator como este:
Model
.find(
{ $text : { $search : "text to look for" } },
{ score : { $meta: "textScore" } }
)
.sort({ score : { $meta : ''textScore'' } })
.exec(function(err, results) {
// callback
});
Esto también clasificará los resultados por puntaje de relevancia.
En cuanto a los weights , puede intentar pasar opciones de pesos al método index (donde se define el índice compuesto) (trabajando al menos con v4.0.1 de mangosta):
schema.index({ animal: ''text'', color: ''text'', pattern: ''text'', size: ''text'' }, {name: ''My text index'', weights: {animal: 10, color: 4, pattern: 2, size: 1}});
var searchQuery=new RegExp(''dam'', ''i'');
var query = { firstName : searchQuery };
Model.find(query ...