随着基于文档数据库的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,并存储它。完成了。很简单。


当前回答

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

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

其他回答

第三方解决方案,比如mongo op-log尾巴是有吸引力的。假设从开发/体系结构的角度来看,仍然存在一些关于解决方案是否可以紧密集成的想法或问题。我不希望看到这些功能的紧密集成解决方案,原因有几个(有些推测和有待澄清,并且没有跟上开发进度):

mongo is c++, lucene/solr are java maybe lucene could use some mongo libs maybe mongo could rewrite some lucene algorithms, see also: http://clucene.sourceforge.net/ http://lucy.apache.org/ lucene supports various doc formats mongo is focused on JSON (BSON) lucene uses immutable documents single field updates are an issue, if they are available lucene indexes are immutable with complex merge ops mongo queries are javascript mongo has no text analyzers / tokenizers (AFAIK) mongo doc sizes are limited, that might go against the grain for lucene mongo aggregation ops may have no place in lucene lucene has options to store fields across docs, but that's not the same thing solr somehow provides aggregation/stats and SQL/graph queries

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

我们同时使用MongoDB和Solr,它们的性能很好。你可以在这里找到我的博客文章,我描述了我们如何一起使用这些技术。以下是节选:

[...] However we observe that query performance of Solr decreases when index size increases. We realized that the best solution is to use both Solr and Mongo DB together. Then, we integrate Solr with MongoDB by storing contents into the MongoDB and creating index using Solr for full-text search. We only store the unique id for each document in Solr index and retrieve actual content from MongoDB after searching on Solr. Getting documents from MongoDB is faster than Solr because there is no analyzers, scoring etc. [...]

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

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

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

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

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