Mongo全文搜索,通过Ruby驱动程序得分

时间:2016-07-05 17:51:05

标签: ruby mongodb full-text-search

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。

2 个答案:

答案 0 :(得分:1)

让我们看一下mongo命令的结构:

db.collection.find(
   <query>,
   { score: { $meta: "textScore" } }
)

我们看到该命令包含两部分(在本例中为find

  1. <query>
  2. options hash
  3. 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}
    

答案 1 :(得分:0)

@ farhatmihalko的回答是正确的。要添加它,这也有效:

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