全文搜索重量在猫鼬

时间:2014-07-12 14:58:18

标签: 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: "best_match_index",

        // Adjust field weights (default is 1)
        weights: {
            animal: 5,  // Most relevant search field
            size:   4   // Also relevant
       }
    }
)

我可以用纯猫鼬做吗?或者我必须使用像mongoose-text-search这样的插件?没有重量怎么样?
我应该怎么做?

4 个答案:

答案 0 :(得分:105)

是的,您可以在Mongoose> = 3.8.9中使用全文搜索。首先,集合最多可以有一个文本索引(参见docs)。因此,要为several fields定义文本索引,您需要复合索引:

schema.index({ animal: 'text', color: 'text', pattern: 'text', size: 'text' });

现在您可以像这样使用$text query operator

Model
    .find(
        { $text : { $search : "text to look for" } }, 
        { score : { $meta: "textScore" } }
    )
    .sort({ score : { $meta : 'textScore' } })
    .exec(function(err, results) {
        // callback
    });

这也将按相关性分数对结果进行排序。

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

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

答案 1 :(得分:2)

从MongoDB 2.6开始,一个集合最多可以有一个文本索引(记录为here)。因此,您将无法使用当前版本的MongoDB执行所需操作。实际上,对于复杂的文本搜索问题,根据匹配的位置需要不同的权重,您应该考虑像Solr或ElasticSearch这样的完整文本搜索解决方案。

作为MongoDB中的一种解决方法,您可以手动对字段进行标记,将它们存储为关键字数组并对其进行索引:

animal: ["The", "quick", "brown", "fox", "jump", ..., "dog"]

然后像

这样的查询

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

模仿文字搜索。这种方法有一些限制,例如设置它所需的手动工作,事实上不会产生干扰,例如,将“梦想”与“梦想”相匹配,这样一个事实就是不会像正常文本索引,并且没有任何加权机制。

答案 2 :(得分:1)

我发现以下文章引导我进入http://code.tutsplus.com/tutorials/full-text-search-in-mongodb--cms-24835 我使用以下

删除了在顶部答案中创建的索引
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);
}
});

答案 3 :(得分:-1)

Dim bassRows = dtSample.Select("Fish = 'Bass'")
For Each dr As DataRow In bassRows
    dr("Fish") = "Pike"
Next