Mongodb - 如何使用查找查询来使用聚合文本搜索

时间:2016-11-04 18:11:45

标签: mongodb mongoose mongodb-aggregation

我在Mongodb中使用聚合方法来进行文本搜索。我已经尝试了各种方法,仍然找不到正确的方法来过滤我的结果。我已经设置了一个索引,它只使用$ text搜索工作正常,并且只对查询工作正常。

这是我进行文本搜索的代码:

Model.aggregate([
    { $match: { $text: { $search: searchValue } } },
    { $project: { displayTitle: 1, title: 1, body: 1, _type: 1, _id: 1, score: { $meta: "textScore" } } },
    { $match: { score: { $gt: 1.0 } } }
], function (err, models) {

})

但是我希望能够通过此查询进一步过滤模型:

Model.find({_parentIds: {$in: arrayOfIds}})

我原以为这会起作用:

Model.aggregate([
    { $match: { $text: { $search: searchValue }, _parentIds: {$in: arrayOfIds} } },
    { $project: { displayTitle: 1, title: 1, body: 1, _type: 1, _id: 1, score: { $meta: "textScore" } } },
    { $match: { score: { $gt: 1.0 } } }
])

但遗憾的是,事实并非如此。有没有人试过这个或者我错过了什么?

这是我正在搜索的示例集合:

[{
    displayTitle: "first item",
    title: "first_item",
    _type: "item",
    _parentIds: ["123", "234"]
}, {
    displayTitle: "second item",
    title: "second_item",
    _type: "item",
    _parentIds: ["123", "234"]
}, {
    displayTitle: "third item",
    title: "third_item",
    _type: "item",
    _parentIds: ["345", "456"]
}]

我目前的搜索结果如下:

searchValue = "item"
arrayOfIds = ["345"];

并且只会期待这份文件:

{
    displayTitle: "third item",
    title: "third_item",
    _type: "item",
    _parentIds: ["345", "456"]
}

谢谢!

1 个答案:

答案 0 :(得分:1)

文字分数为0.75。因此,将匹配过滤器更改为大于0.5可以正常工作。

修改投影以排除正文,_id并包含父ID。

使用此查询创建索引。

db.textcol.aggregate([
    { $match: { $text: { $search: "item" }, _parentIds: {$in: ["345"]} }} ,
    { $project: { displayTitle: 1, title: 1, _type: 1, _id: 0, _parentIds :1, score: { $meta: "textScore" } }},
        { $match: { score: { $gt: 0.5 } } }
])

运行此查询。

{
    "displayTitle": "third item",
    "title": "third_item",
    "_type": "item",
    "_parentIds": ["345", "456"],
    "score": 0.75
}

输出:

const int &r {100};