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

时间:2011-02-18 18:29:47

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

我对MorphiaMongoDB以及面向文档的数据库都很新。我正在寻找有关如何解决以下问题的一般指导。

我们有一个包含大约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. 中的搜索字词匹配的图书
  3. 仅在titleFTS字段
  4. 中匹配的图书
  5. 仅在descriptionFTS字段
  6. 中匹配的图书
  7. 最多sales
  8. 的书籍
  9. 最高rating
  10. 的图书
  11. 最高ratingscount
  12. 的图书

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

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

2 个答案:

答案 0 :(得分:4)

我强烈建议使用外部全文引擎,例如Solr或ElasticSearch。 MongoDB与全文搜索相关的功能确实不合适 用于真正的全文解决方案。您采用预先干预等方法只是一种肮脏的解决方法。只要MongoDB不提供合适的全文集成,如果您对一个认真且有效的解决方案感兴趣,请使用外部解决方案。

答案 1 :(得分:0)

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