Mongodb mongoose中带权重的全文搜索

Mongodb mongoose中带权重的全文搜索,mongodb,mongoose,full-text-search,Mongodb,Mongoose,Full Text Search,我发现,从3.8.9版开始,mongoose就支持全文搜索。但是我找不到好的文档 我想做一些类似的事情: db.collection.ensureIndex( // Fields to index { animal: "text", color: "text", pattern: "text", size: "text" }, // Options { name:

我发现,从3.8.9版开始,mongoose就支持全文搜索。但是我找不到好的文档
我想做一些类似的事情:

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
       }
    }
)
我能用纯猫鼬做吗?或者我必须使用一些插件,比如?不加重量怎么样?

我该怎么做呢?

从MongoDB 2.6开始,一个集合最多可以有一个文本索引(文档化)。因此,您将无法使用当前版本的MongoDB执行您想要的操作。事实上,对于复杂的文本搜索问题,根据匹配的位置,不同权重的要求,你应该考虑一个完整的文本搜索解决方案,如SoR或弹性搜索。p> 作为MongoDB中的一种解决方法,您可以手动标记字段,将其存储为关键字数组,并为其编制索引:

animal: ["The", "quick", "brown", "fox", "jump", ..., "dog"]
然后是一个类似于

db.test.find({animal:{$in:[“brown”,“shoes”]})


模拟文本搜索。这种方法有一些局限性,如设置它所需的手动工作,没有词干,例如,匹配“梦”和“梦”是的,您可以在Mongoose>=3.8.9中使用全文搜索。首先,集合最多可以有一个文本索引(请参阅)。因此,要为定义文本索引,您需要使用复合索引:

schema.index({animal:'text',color:'text',pattern:'text',size:'text'});
现在您可以这样使用:

模型
.找到(
{$text:{$search:“要查找的文本”},
{score:{$meta:“textScore”}
)
.sort({score:{$meta:'textScore'}})
.exec(函数(错误、结果){
//回拨
});
这也将根据相关性得分对结果进行排序

至于,您可以尝试将权重选项对象传递给方法(在其中定义复合索引)(至少使用mongoose的v4.0.1):

schema.index({animal:'text',color:'text',pattern:'text',size:'text'},{name:'My text index',权重:{animal:10,color:4,pattern:2,size:1});

我找到了下面这篇文章,它让我找到了 我使用下面的方法删除了在顶部答案中创建的索引

db.tablename.dropIndex({"indexname_text"})  
我用这个命令得到了索引列表

db.tablename.getIndexes()
然后,我使用以下方法创建索引

db.tablename.createIndex({"$**":"text"})
以下命令在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);
}
});

你试过调用模式来添加文本索引吗?我在模式中以索引的形式添加了它:“text”,但我想在多个字段上建立索引,如上面的示例所示。不要在模式定义中声明它,请调用模式的
index
方法。你的意思是'schema.index({animal:'text',color:'text',pattern:'text',size:“text”})?权重呢?它是一个索引还是4个索引?事实上,我只有一个包含多个字段的文本索引。blow代码是.getIndexes()的一部分。我使用它,我正在寻找它的纯猫鼬版本。`{“v”:1,“key”:{“\fts”:“text”,“\ftsx”:1},“ns”:“public-diary-dev.diaries”,“name”:“完整搜索索引”,“background”:true,“weights”:{“tags”:1,“text”:1,“title”:1},“default_language”:“english”,“language_override”:“language”,“textinexversion”:1}`返回的错误:只需要$text query的一个文本索引要为几个字段定义文本索引,您需要复合索引。请确保您正确定义了复合索引。这个过程是否有文档记录?我正在尝试将文本索引与mongoose一起使用,但不起作用。我创建了一个复合索引,我使用了$text运算符,如yo例如,但结果总是一个空文档。请参阅和。您的Mongoose版本是什么?(全文搜索适用于版本>=3.8.9)@Mallen你找到解决方案了吗?这个答案真是个炸弹!我浪费了两个小时试图在我的模式中添加一个文本索引,而这个简单的as-f**k答案就是我所需要的。Huzzah!是的,是的,但是你不能避免使用正则表达式来创建人性化的查询。小心点,因为它可能会意外导致
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);
}
});