Mongo 通过 Ruby 驱动程序进行带分数的全文搜索

Mongo full text search with score via Ruby driver

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

  1. <query>
  2. options hash

mongo-驱动程序中的命令结构与 mongo 非常相似。但有些事情并不简单。

在 mongo-驱动程序中我们有 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}

@farhatmihalko 的回答很准确。添加到它,这也有效:

posts
  .find("$text": { "$search": "house" })
  .projection(score: { "$meta": "textScore" }, rooms: 1)