随着基于文档数据库的NoSQL运动的发展,我最近研究了MongoDB。我注意到在如何将项目视为“文档”方面有惊人的相似之处,就像Lucene(以及Solr的用户)所做的那样。

那么,问题来了:为什么你想要使用NoSQL (MongoDB, Cassandra, CouchDB等)而不是Lucene(或Solr)作为你的“数据库”?

我(我相信其他人也一样)想要的答案是对它们进行深入的比较。让我们一起跳过关系数据库的讨论,因为它们有不同的用途。

Lucene提供了一些重要的优势,比如强大的搜索和权重系统。更不用说Solr中的facet了(Solr很快就要被集成到Lucene中了!)你可以使用Lucene文档来存储id,并像MongoDB一样访问这些文档。将它与Solr混合使用,您现在就得到了一个基于webservice的负载均衡解决方案。

在讨论MongoDB类似的数据存储和可伸缩性时,您甚至可以将Velocity或MemCached等进程外缓存提供商进行比较。

MongoDB的限制让我想起了使用MemCached,但是我可以使用微软的Velocity,并且比MongoDB拥有更多的分组和列表收集能力(我认为)。没有比在内存中缓存数据更快或可伸缩的方法了。甚至Lucene也有内存提供商。

MongoDB(和其他)确实有一些优势,比如它们的API易于使用。新建一个文档,创建一个id,并存储它。完成了。很简单。


当前回答

由于没有人提到它,让我补充一下,MongoDB是无模式的,而Solr强制使用模式。因此,如果文档的字段可能会发生变化,这是选择MongoDB而不是Solr的一个原因。

其他回答

另外请注意,有些人已经将Solr/Lucene集成到Mongo中,将所有索引存储在Solr中,并监视oplog操作,并将相关更新级联到Solr中。

使用这种混合方法,您可以真正兼得全文搜索和快速读取等功能,并使用可靠的数据存储,同时还可以具有惊人的写入速度。

设置起来有点技术性,但是有很多oplog tailer可以集成到solr中。看看rangespan在本文中做了什么。

http://denormalised.com/home/mongodb-pub-sub-using-the-replication-oplog.html

如果你只是想用键值格式存储数据,不建议使用Lucene,因为它的倒立索引会浪费太多的磁盘空间。由于数据保存在磁盘上,它的性能比NoSQL数据库(如redis)慢得多,因为redis将数据保存在RAM中。Lucene最大的优势是它支持大量的查询,因此可以支持模糊查询。

从我的经验来看,Mongo非常适合简单、直接的使用。Mongo的主要缺点是在意料之外的查询上性能很差(你不能为所有可能的过滤/排序组合创建Mongo索引,你就是不能)。

在这方面,Lucene/Solr大受欢迎,特别是在FilterQuery缓存方面,性能非常出色。

由于没有人提到它,让我补充一下,MongoDB是无模式的,而Solr强制使用模式。因此,如果文档的字段可能会发生变化,这是选择MongoDB而不是Solr的一个原因。

@mauricio-scheffer提到了Solr 4——对于那些对此感兴趣的人,LucidWorks将Solr 4描述为“NoSQL搜索服务器”,在http://www.lucidworks.com/webinar-solr-4-the-nosql-search-server/上有一个视频,他们详细介绍了NoSQL(有点)特性。(ish代表他们版本的无模式实际上是一种动态模式。)