ruby - 通过 Ruby 驱动程序进行 Mongodb 全文搜索和评分

标签 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。

最佳答案

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

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

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

  1. <query>
  2. 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/

相关文章:

ruby-on-rails - 使用 gem install rails,现在我有 4.0.0.rc1 - 我想要 Rails 3

java - Spring数据MongoDB : update using dot-notation

mongodb - 这两个 mongo "queries"有什么区别?

mongodb - Talend 数据准备 : Mongodb already installed locally on this computer

MySQL 电子邮件地址搜索列

elasticsearch - Elasticsearch为非结构化数据(如pdf文件)建立索引的背后原理是什么?

c# - 如何优化MySQL bool 全文搜索? (或者用什么来替换它?) - C#

ruby-on-rails - Rails 应用程序的条形码扫描器

ruby-on-rails - 根据另一哈希数组的键值更新一个哈希数组

ruby-on-rails - 无效的 gemspec - 格式错误的要求 ["#<YAML::Syck::DefaultKey:0xb5f9c990> 3.2.0"]