草庐IT

mongodb - 吗非亚/MongoDB : ordering search results from advanced queries

coder 2023-11-02 原文

我对 Morphia 还很陌生, MongoDB ,以及一般的面向文档的数据库。我正在寻找有关如何解决以下问题的一般指导。

我们有一个包含大约 500K Book 文档的数据库。

{ 
   "isbn" : "0-691-01305-5", 
   "title" : "For Whom the Bell Tolls", 
   "titleFTS" : [
       "bell",
       "toll" ],
   "author" : "Hemingway, Ernest",
   "ratingsCount" : 138, 
   "rating" : "3.5", 
   "sales" : 10245
   "price" : "12.95", 
   "category" : "fiction", 
   "description" : "The story of a young American in the International Brigades attached to a republican guerilla unit during the Spanish Civil War.",
   "descriptionFTS" : [
       "story",
       "young",
       "americ",
       "internat",
       "brigade",
       "attach",
       "republic",
       "guerilla",
       "unit",
       "spanish",
       "civil",
       "war"]
}

我们需要对标题和描述字段执行全文搜索。为此,我创建了 titleFTSdescriptionFTS 数组,分别包含来自 titledescription 字段的单词,过滤停用词,然后进行词干提取。

搜索时,用户输入关键词,我们返回匹配所有输入词的图书,例如:

db.Book.find({ titleFTS : { $all: ['spanish', 'civil', 'war']}})
db.Book.find({ descriptionFTS : { $all: ['spanish', 'civil', 'war']}})

这工作正常,但现在我们来到了困难的部分:我们想根据多个条件对上述查询的结果进行排序。一种这样的建议顺序如下:

  1. titleFTSdescriptionFTS 字段中匹配搜索词的图书
  2. 仅在 titleFTS 字段中匹配的书籍
  3. 仅在 descriptionFTS 字段中匹配的书籍
  4. 销量最高的图书
  5. 具有最高评分的书籍
  6. ratingscount 最高的书

我们的应用程序是用 Java 编写的,并使用 MorphiaDB API。我可以想象如何编写 Java Comparator对于这种事情很容易,但显然我想在数据库级别进行排序。

这最终让我想到了一个问题:这可以使用 Morphia API 来完成吗?或者我是否需要深入研究使用 DB.command() 编写 Javascript?它需要 Map/Reduce 吗?如果是这样,关于如何针对此问题实现 map/reduce 的提示将大有帮助。

最佳答案

我现在强烈建议使用外部全文引擎,例如 Solr 或 ElasticSearch。 MongoDB全文搜索相关的能力确实不适合 对于真正的全文解决方案。您使用预词干等方法只是一种肮脏的解决方法。只要 MongoDB 不提供合适的全文集成,如果您对严肃且有效的解决方案感兴趣,就可以使用外部解决方案。

关于mongodb - 吗非亚/MongoDB : ordering search results from advanced queries,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5045146/

有关mongodb - 吗非亚/MongoDB : ordering search results from advanced queries的更多相关文章

  1. ruby-on-rails - 在没有 :total_entries to improve a lengthy query 的情况下使用 will_paginate - 2

    我有一个will_paginate的当前实现,它使用paginate_by_sql方法来构建要分页的集合。我们有一个针对total_entries的自定义查询,它非常复杂并且给我们的数据库带来了很大的负载。因此,我们想从分页中完全删除total_entries。换句话说,我们只需要一个“下一个-上一个”按钮,而不是“上一个1[2]345下一个”的典型分页显示。但我们需要了解一些事情。我们是否显示上一个链接?这当然只会发生在当前选择中显示的记录之前存在的记录我们是否显示下一个链接?如果显示集合中的最后一条记录,则不会显示此内容来自docsAqueryforcountingrowswill

  2. ruby - 全新应用程序服务器上的 Rails 'parse_query' 错误 - 2

    我已经在OSX10.10.3上安装了:自制软件,命令行工具,然后使用rbenv安装ruby​​:ruby2.2.2p95(2015-04-13revision50295)[x86_64-darwin14]Rails4.2.2当我创建一个新的应用程序(使用默认的sqlite数据库)并尝试运行它时,它说:=>BootingWEBrick=>Rails4.2.2applicationstartingindevelopmentonhttp://localhost:3000=>Run`railsserver-h`formorestartupoptions=>Ctrl-Ctoshutdownser

  3. ruby-on-rails - 对于新的 ActiveRecord 模型,为什么有些 has_many :through associations add a (1=0) predicate and distinct clause to the sql query? - 2

    每当我实例化一个新的ActiveRecord模型(一个尚未持久化到数据库中的模型)并尝试访问构建模型上的一些各种关联时,Rails查询构建器有时会:将(1=0)谓词添加到查询的where子句。在select语句中添加“distinct”子句。我认为这只会在has_many:through关联连接两个或多个表时发生。我想知道为什么它添加了(1=0)谓词以及distinct子句。对于(1=0)谓词,新模型是否已保存到数据库应该无关紧要(对吧?)。我不知道为什么要添加distinct子句。我在下面有一个简单的例子。classAssignment#s.assignment_attachment

  4. ruby-on-rails - 弃用警告 : Dangerous query method (method whose arguments are used as raw SQL) called with non-attribute argument(s) - 2

    我将我的Rails5.1.4应用更新到了5.2.0。我的一个模型中有以下范围:scope:by_category,lambda{|category_slug|category_ids=Category.find_by(slug:category_slug)&.subtree_idswhere(category_id:category_ids)}由于该范围,Rails返回以下错误:DEPRECATIONWARNING:Dangerousquerymethod(methodwhoseargumentsareusedasrawSQL)calledwithnon-attributeargume

  5. ruby-on-rails - 在一个 Rails 应用程序中使用 PostgreSQL 的 MongoDB - 2

    我可以在一个Rails应用程序中同时使用MongoDB和PostgreSQL吗?具体来说,我最终会想要使用像MongoHQ这样的东西。到目前为止,我未能在实验中进行这项工作。令我担心的是,MongoDB文档特别指出我必须禁用ActiveRecord。任何建议将不胜感激。 最佳答案 您无需禁用ActiveRecord即可使用MongoDB。查看Mongoid只需将gem加上任何模型与您现有的任何ActiveRecord模型一起添加。您应该注意到MongoHQ只是MongoDB的托管服务,可以与任何对象文档映射器(ODM)一起使用。更多

  6. ruby - 使用 mongodb/mongoid 运行时更改模型 - 2

    我必须在mongoid模型中添加几个字段,我知道MongoDB没有迁移,但如果我继续而不删除数据库,使rails完全“重新生成”数据库,它不会显示或使用新的领域!去这里最好的方法是什么?有比删除/重新打开mongodb更软的东西吗?提前致谢卢卡 最佳答案 一般来说,应该可以在运行时用新字段更新旧文档。MongoDB中不需要迁移。您可能想编写rake任务以使用新字段和默认值更新旧文档。您可以通过检查那些默认值为nil的新字段来找到这些文档。更新简单风格:如果您使用默认值定义一个新字段,只要您设置了一个新值,就应该始终使用该值:应用程序

  7. ruby-on-rails - rails : Sorting a query by params? - 2

    我正在使用运行一个简单的查找全部并使用willpaginate分页,但我也希望由用户对查询进行排序。想到的第一个解决方案就是使用params[:sort]http://localhost:3000/posts/?sort=created_at+DESC@posts=Post.paginate:page=>params[:page],:order=>params[:sort]但他的方法的问题是查询默认为按ID排序,我希望它是created_at。这是一种安全的排序方法吗?有没有办法默认使用created_at? 最佳答案 我会使用命名

  8. ruby-on-rails - 我如何从 Ruby 代码连接到 mongodb? - 2

    我如何从Ruby代码连接到mongodb? 最佳答案 首先,您必须安装MongoDbgem:geminstallmongo然后运行代码:require'rubygems'#notnecessaryforRuby1.9require'mongo'db=Mongo::Connection.new.db("mydb")#ORdb=Mongo::Connection.new("localhost").db("mydb")#ORdb=Mongo::Connection.new("localhost",27017).db("mydb")

  9. ruby - MongoDB:无法从 BSON 类型 EOO 转换为 Date - 2

    我正在尝试使用聚合框架(使用ruby​​)并像这样投影日期:db['requests'].aggregate([{"$project"=>{_id:0,method:'$method',user:'$user',year:{'$year'=>'$timestamp'}}}])文档是这样的:{_id:ObjectId("5177d7d7df26358289da7dfd"),timestamp:ISODate("2013-04-12T03:58:05+00:00"),method:"POST",status:"200",inputsize:"874",outputsize:"4981",u

  10. ruby - 在 Ruby 中从 MongoDB 中检索字段的子集 - 2

    我试图通过在Ruby中进行的查询从MongoDB获取字段的子集,但它似乎不起作用。它不返回任何结果这是ruby代码:coll.find("title"=>'Halo',:fields=>["title","isrc"])#thisdoesn'twork如果我删除字段散列,它会工作,返回包含所有字段的结果coll.find("title"=>'Halo')#thisworks查看mongodb控制台,第一个查询在mongodb服务器上结束,如下所示:{title:"Halo",fields:["title","isrc"]}如果我尝试从mongo客户端控制台进行查询,它会工作,我会得到结

随机推荐