【问题标题】:Morphia/MongoDB: ordering search results from advanced queriesMorphia/MongoDB:从高级查询中排序搜索结果
【发布时间】:2011-02-18 18:29:47
【问题描述】:

我对@9​​87654321@、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. sales 数量最多的书籍
  5. rating 最高的书籍
  6. ratingscount 最高的书籍

我们的应用是用 Java 编写的,并使用 MorphiaDB API。我可以很容易地设想如何为这类事情编写 Java Comparator,但显然我想在 DB 级别进行排序。

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

【问题讨论】:

    标签: mongodb mapreduce full-text-search morphia nosql


    【解决方案1】:

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

    【讨论】:

    • 嗯,我在(遥远的)过去使用过 Lucene,但不知道 Solr。虽然它可以很好地处理 FTS,但您认为 Solr 是否也能够处理我提到的其他类型的查询?或者我是否需要结合 Solr 继续使用 MongoDB(或一些 RDBMS)?
    • Lucene 和 Solr 基本相同。 Solr 和 ElasticSearch 都可以处理各种复杂的查询、排名、排序等。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      • 2018-10-21
      • 2015-06-09
      • 1970-01-01
      • 2013-12-18
      相关资源
      最近更新 更多