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


当前回答

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

其他回答

MongoDB Atlas很快就会有一个基于lucene的搜索引擎。这一重大消息是在本周的2019年MongoDB世界会议上宣布的。这是鼓励他们更多使用高收入的MongoDB Atlas产品的好方法。

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

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

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

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/

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

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

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