在 Mongo documentation ,它说你可以这样做:
db.articles.find(
{ $text: { $search: "cake" } },
{ score: { $meta: "textScore" } }
)
当我从 mongo 控制台运行它时,效果很好,但我不知道如何通过 Ruby 驱动程序来做到这一点。
当我这样做时:
articles.find('$text': { '$search': 'cake' }, score: { '$meta': 'textScore' })
我明白了
Mongo::Error::OperationFailure: unknown operator: $meta (2)
当我这样做的时候
articles.find({ '$text': { '$search': 'cake' } }, score: { '$meta': 'textScore' })
我得到了结果,但它不包括分数,并且日志消息没有显示它正在使用 score: { $meta': 'textScore' }
:
{"find"=>"articles", "filter"=>{"$text"=>{"$search"=>"cake"}}}
我想我只是不明白 Ruby 驱动程序和 Mongo CLI 如何将它们转换为 Mongo 查询。
我使用的是 MongoDB 版本 v3.2.7 和 mongo gem 版本 2.2.5。
最佳答案
让我们看看 mongo
的结构命令:
db.collection.find(
<query>,
{ score: { $meta: "textScore" } }
)
我们看到该命令包含两个部分(在本例中为 find
)
-
<query>
-
options hash
mongo-driver 中的命令结构与 mongo 非常相似。但有些事情并不简单。
在 mongo-driver 中,我们有 Mongo::Collection::View
,检查( link to source ):
articles.find({ '$text': { '$search': 'cake' } }.class # => Mongo::Collection::View
所以分析代码后,我发现可以使用projection
选项,但它很棘手:
articles.find(
{ "$text" => { "$search" => "cake" } },
projection: {
"score" => { "$meta" => "textScore" },
some_field: 1
})
我的测试是:
posts.find(
{ "$text" => { "$search" => "house" } },
projection: { "score" => { "$meta" => "textScore" }, rooms: 1 }
)
结果是:
{"_id"=>BSON::ObjectId('53f5c8b54465764a82fb0000'),
"rooms"=>2.0,
"score"=>0.5004448398576512}
关于ruby - 通过 Ruby 驱动程序进行 Mongodb 全文搜索和评分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38209651/