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


这是一个很好的问题,我已经思考了很久。我将总结我的经验教训:

You can easily use Lucene/Solr in lieu of MongoDB for pretty much all situations, but not vice versa. Grant Ingersoll's post sums it up here. MongoDB etc. seem to serve a purpose where there is no requirement of searching and/or faceting. It appears to be a simpler and arguably easier transition for programmers detoxing from the RDBMS world. Unless one's used to it Lucene & Solr have a steeper learning curve. There aren't many examples of using Lucene/Solr as a datastore, but Guardian has made some headway and summarize this in an excellent slide-deck, but they too are non-committal on totally jumping on Solr bandwagon and "investigating" combining Solr with CouchDB. Finally, I will offer our experience, unfortunately cannot reveal much about the business-case. We work on the scale of several TB of data, a near real-time application. After investigating various combinations, decided to stick with Solr. No regrets thus far (6-months & counting) and see no reason to switch to some other.

总结:如果你没有搜索需求,Mongo提供了一个简单而强大的方法。然而,如果搜索是你的产品的关键,你最好坚持使用一种技术(Solr/Lucene),并对其进行优化——减少移动部件。

我的两分钱,希望能有所帮助。


在solr中不能部分更新文档。为了更新文档,您必须重新发布所有字段。

性能很重要。如果不提交,则对solr的更改不会生效,如果每次都提交,则性能会受到影响。

在solr中没有事务。

由于solr有这些缺点,有时NoSQL是更好的选择。

更新:Solr 4+开始支持提交和软提交。参考最新文档https://lucene.apache.org/solr/guide/8_5/


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

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

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

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


由于没有人提到它,让我补充一下,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. [...]


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

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


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


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


第三方解决方案,比如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 Atlas很快就会有一个基于lucene的搜索引擎。这一重大消息是在本周的2019年MongoDB世界会议上宣布的。这是鼓励他们更多使用高收入的MongoDB Atlas产品的好方法。

我希望它能被应用到MongoDB企业版4.2中,但目前还没有将其应用到他们的on-prem产品线的消息。

更多信息请访问:https://www.mongodb.com/atlas/full-text-search