产品目录搜索 - NoSQL / MongoDB的良好用例?

时间:2011-04-20 07:48:00

标签: asp.net-mvc mongodb asp.net-mvc-3 appharbor nosql

我们正在开发一个部署在AppHarbor上的ASP.NET MVC 3网站。该网站上至少有10,000种产品。用户可以基于标记系统搜索产品(例如,搜索“color = blue”加上“size = 10”加上“category = whatever”)。因此,这个系统将在数据库读取和写入时点亮,我们主要关心的一个问题是保持搜索功能的速度极快。为此,我们还希望结合一些缓存结果。

  1. 我们认为这是一个使用NoSQL数据库的好用例(我们一直在关注MongoDB,要托管在https://mongohq.com上)是对还是错?

  2. 如果我们使用MongoDB,我们应该研究哪些缓存策略?

  3. 干杯!

2 个答案:

答案 0 :(得分:7)

MongoDB非常适合标记,因为它具有multikeys功能

e.g。假设您创建了这样的产品文档

{
    _id : 1,
    name : "Widget",
    tags: [
        {color : "blue"},
        {size : 10},
        {foo : "bar"}
    ]
}

然后,您可以在tags数组上创建索引,并为每个项目编制索引。因此,要找到所有蓝色的产品,您可以这样查询:

db.Products.find({tags : {color : "blue"}});

关于这个的好处是每个项目都可以有一组完全不同的标签“属性”,查询将能够使用索引 - 有些可能有颜色和大小,有些可能有重量和高度。

关于缓存,在MongoDB中,有足够的RAM来保存你的工作集在内存中是很重要的(足以容纳所有访问的数据和索引)。这样,数据将保留在内存中,使查询非常快速。因此,您可能不需要顶部的缓存技术。

答案 1 :(得分:1)

虽然MongoDB会做你想要的,但我会认真考虑研究Lucene或Solr,它们在搜索方面本质上更好。它们提供了非常强大的搜索功能,例如分面搜索和“你是不是......”类型的功能,MongoDB不会做,也可能永远不会。

您今天可能不需要这种功能,但请花点时间考虑一下您将来可能需要的功能。