NoSQL(MongoDB)与Lucene(或Solr)作为您的数据库

NoSQL(MongoDB)与Lucene(或Solr)作为您的数据库,mongodb,solr,lucene,memcached,nosql,Mongodb,Solr,Lucene,Memcached,Nosql,随着NoSQL运动在基于文档的数据库基础上的发展,我最近研究了MongoDB。我注意到,如何将项目视为“文档”有着惊人的相似性,就像Lucene(以及Solr的用户)所做的那样 因此,问题是:为什么要在Lucene(或Solr)之上使用NoSQL(MongoDB、Cassandra、CouchDB等)作为“数据库” 我(我相信其他人)在寻找答案时,会对它们进行深入的比较。让我们一起跳过关系数据库讨论,因为它们有不同的用途 Lucene提供了一些重要的优势,例如强大的搜索和权重系统。更不用说Sol

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

因此,问题是:为什么要在Lucene(或Solr)之上使用NoSQL(MongoDB、Cassandra、CouchDB等)作为“数据库”

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

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

在讨论MongoDB类似的数据存储和可伸缩性时,您甚至可以对进程外缓存提供程序(如Velocity或MemCached)进行比较

MongoDB的限制让我想起了使用MemCached,但我可以使用微软的Velocity,并且比MongoDB有更多的分组和列表收集能力(我认为)。无法比在内存中缓存数据更快或更具可扩展性。甚至Lucene也有一个内存提供程序


MongoDB(和其他)确实有一些优势,比如它们的API的易用性。新建文档、创建id并存储它。完成。这是一个很好的问题,我已经思考了很多。我将总结我的经验教训:

  • 在几乎所有情况下,您都可以轻松地使用Lucene/Solr代替MongoDB,但反之亦然。格兰特英格索尔酒店

  • MongoDB等似乎用于不需要搜索和/或刻面的目的。对于摆脱RDBMS世界的程序员来说,这似乎是一个更简单、更容易的过渡。除非你习惯了,否则Lucene&Solr的学习曲线会更陡

  • 使用Lucene/Solr作为数据存储的例子并不多,但《卫报》已经取得了一些进展,并在一篇优秀的文章中对此进行了总结,但他们也没有承诺完全跳上Solr的潮流,并“调查”Solr与CouchDB的结合

  • 最后,我将提供我们的经验,不幸的是,我们不能透露太多关于商业案例的信息。我们在数TB的数据规模上工作,这是一个近乎实时的应用程序。在调查了各种组合后,决定坚持使用Solr。到目前为止没有遗憾(6个月&正在计算),也看不出有理由改用其他方法

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


    我的2美分,希望能有所帮助。

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

    和性能问题。如果不提交,对solr的更改将不会生效,如果每次都提交,性能将受到影响

    solr中没有事务

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

    更新:Solr 4+开始支持提交和软提交。请参阅最新文档


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

    使用这种混合方法,您可以真正做到两全其美,具有诸如全文搜索和快速读取等功能,并具有可靠的数据存储,还可以具有极高的写入速度

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


    因为没有人提到它,所以让我补充一点,MongoDB是无模式的,而Solr强制执行模式。因此,如果文档的字段可能会更改,这就是选择MongoDB而不是Solr的原因之一。

    我们将MongoDB和Solr结合使用,它们的性能很好。你可以在我描述我们如何一起使用这些技术的地方找到我的答案。这里有一段摘录:

    […]然而,我们观察到,当索引 尺寸增大。我们意识到最好的解决方案是同时使用Solr和Solr 和Mongo DB在一起。然后,通过存储Solr和MongoDB 将内容导入MongoDB并使用Solr创建全文索引 搜索。我们只在Solr索引中存储每个文档的唯一id 并在Solr上搜索后从MongoDB检索实际内容。 从MongoDB获取文档比Solr更快,因为没有 分析仪、计分仪等[…]


    根据我对两者的经验,Mongo非常适合简单、直接的使用。我们遇到的主要Mongo缺点是在意外查询上的性能差(您无法为所有可能的筛选/排序组合创建Mongo索引,您不能)


    Lucene/Solr在这里大行其道,特别是FilterQuery缓存,性能非常出色。

    @mauricio scheffer提到了Solr 4——对于那些对此感兴趣的人,LucidWorks将Solr 4描述为“NoSQL搜索服务器”,并在视频中详细介绍了NoSQL(ish)功能。(ish表示他们的无模式版本实际上是一个动态模式。)

    如果您只想使用键值格式存储数据,不建议使用Lucene,因为它的反向索引将浪费太多磁盘空间。由于数据保存在磁盘上,它的性能比NoSQL数据库(如redis)慢得多,因为redis将数据保存在RAM中。最