【发布时间】:2011-02-18 18:29:47
【问题描述】:
我对@987654321@、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"]
}
我们需要对标题和描述字段执行全文搜索。为此,我创建了 titleFTS 和 descriptionFTS 数组,它们分别包含来自 title 和 description 字段的单词,过滤掉停用词,然后进行词干处理。
搜索时,用户输入关键字,我们返回与输入的所有词匹配的图书,例如:
db.Book.find({ titleFTS : { $all: ['spanish', 'civil', 'war']}})
db.Book.find({ descriptionFTS : { $all: ['spanish', 'civil', 'war']}})
这很好用,但现在我们遇到了困难的部分:我们希望根据多个条件对上述查询的结果进行排序。一种这样的建议排序如下:
- 在
titleFTS和descriptionFTS字段中匹配搜索词的书籍 - 仅在
titleFTS字段中匹配的图书 - 仅在
descriptionFTS字段中匹配的图书 -
sales数量最多的书籍 -
rating最高的书籍 -
ratingscount最高的书籍
我们的应用是用 Java 编写的,并使用 MorphiaDB API。我可以很容易地设想如何为这类事情编写 Java Comparator,但显然我想在 DB 级别进行排序。
这最终让我想到了一个问题:这可以使用 Morphia API 完成吗?还是我需要深入研究使用 DB.command() 编写 Javascript?它需要 Map/Reduce 吗?如果是这样,关于如何为这个问题实现 map/reduce 的提示会很有帮助。
【问题讨论】:
标签: mongodb mapreduce full-text-search morphia nosql