Morphia/MongoDB:从高级查询中排序搜索结果

Morphia/MongoDB:从高级查询中排序搜索结果,mongodb,mapreduce,full-text-search,morphia,nosql,Mongodb,Mapreduce,Full Text Search,Morphia,Nosql,一般来说,我对数据库和面向文档的数据库相当陌生。我正在寻找关于如何处理以下问题的一般指导 我们有一个数据库,里面有大约500K的书籍文档 { "isbn" : "0-691-01305-5", "title" : "For Whom the Bell Tolls", "titleFTS" : [ "bell", "toll" ], "author" : "Hemingway, Ernest", "ratingsCount" : 13

一般来说,我对数据库和面向文档的数据库相当陌生。我正在寻找关于如何处理以下问题的一般指导

我们有一个数据库,里面有大约500K的
书籍
文档

{ 
   "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"]
}
我们需要对标题和描述字段执行全文搜索。为此,我创建了
titleFTS
descriptionFTS
数组,分别包含
title
description
字段中的单词,过滤停止单词,然后进行词干分析

搜索时,用户输入关键字,我们返回与所有输入术语匹配的书籍,例如:

db.Book.find({ titleFTS : { $all: ['spanish', 'civil', 'war']}})
db.Book.find({ descriptionFTS : { $all: ['spanish', 'civil', 'war']}})
这很好,但现在我们要做的是:我们希望根据多个条件对上述查询的结果进行排序。其中一项拟议订购如下:

  • titleFTS
    descriptionFTS
    字段中匹配搜索词的书籍
  • 仅在
    titleFTS
    字段中匹配图书
  • 仅在
    descriptionFTS
    字段中匹配图书
  • 销量最大的书籍
  • 评级最高的书籍
  • 具有最高
    评级的书籍
  • 我们的应用程序是用Java编写的,并使用MorphiaDB API。我可以很容易地想象如何为这类事情编写Java,但显然我想在DB级别上进行排序


    这最后让我想到了一个问题:这可以通过使用Morphia API来实现吗?或者我需要深入研究使用DB.command()编写Javascript吗?是否需要映射/还原?如果是这样的话,一个关于如何为这个问题实现map/reduce的提示将非常有用。

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

    Lucene和solr允许您在许多字段上构建复杂的布尔查询,包括数字范围查询,甚至地理位置查询

    嗯,我以前用过Lucene,但不知道Solr。虽然Solr可以很好地处理FTS,但您认为Solr也能够处理我提到的其他类型的查询吗?或者我需要继续使用MongoDB(或一些RDBMS)与Solr结合使用吗?Lucene和Solr基本上是一样的。Solr和ElasticSearch都可以处理各种复杂的查询、排名、排序等。