NoSQL(MongoDB)vs Lucene(或Solr)作为你的数据库

随着NoSQL运动在基于文档的数据库的基础上不断发展,我最近研究了MongoDB。 我已经注意到与Lucene一样(和Solr的用户)如何将项目视为“文档”,这一点非常相似。

所以,问题是: 你为什么要使用Lucene(或Solr)上的NoSQL(MongoDB,Cassandra,CouchDB等)作为你的“数据库”?

我(而且我相信其他人)正在寻找答案的是他们的一些深入的比较。 让我们一起跳过关系数据库的讨论,因为他们服务于不同的目的。

Lucene具有强大的search和权重系统等优点。 更不要说Solr的一面(Solr即将被整合到Lucene中,耶!)。 您可以使用Lucene文档来存储ID,并像MongoDB一样访问这些文档。 把它和Solr混合起来,你就可以得到一个基于WebService的,负载平衡的解决scheme。

在讨论MongoDB的类似数据存储和可伸缩性时,甚至可以比较Velocity或MemCached之类的超级caching提供程序。

MongoDB的限制让我想起使用MemCached,但是我可以使用微软的Velocity,并且对MongoDB有更多的分组和列表收集能力(我认为)。 无法获得比在内存中caching数据更快或可伸缩的内容。 即使Lucene有一个内存提供者。

MongoDB(和其他)确实有一些优点,比如API的易用性。 新build一个文档,创build一个id,然后存储它。 完成。 好,易于。

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

  1. 在很多情况下,您都可以轻松使用Lucene / Solr来代替MongoDB,反之则不然。 格兰特·英格索尔的文章总结了这里。

  2. MongoDB等似乎在没有search和/或刻面要求的情况下起作用。 程序员从RDBMS世界中解脱出来似乎是一个更简单和可以说更容易的过渡。 除非有人习惯,否则Lucene和Solr的学习曲线会更陡。

  3. 使用Lucene / Solr作为数据存储的例子并不多,但Guardian已经在一个出色的滑动平台上取得了一些进展,并总结了这一点,但是他们对于Solr的潮stream和对Solr的“调查”与CouchDB。

  4. 最后,我会提供我们的经验,遗憾的是不能透露更多的商业案例。 我们按照几TB数据的规模工作,这是一个接近实时的应用程序。 经过调查各种组合,决定坚持Solr。 到目前为止没有遗憾(6个月和计数),看到没有理由切换到其他。

总结:如果你没有search要求,Mongo提供了一个简单而强大的方法。 然而,如果search是您提供的关键,那么最好是坚持一种技术(Solr / Lucene),并优化其中的运动部件。

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

您不能部分更新solr中的文档。 您必须重新发布所有字段才能更新文档。

而且性能很重要。 如果你没有提交,那么你对solr的改变不会生效,如果你每次提交,性能都会受到影响。

solr没有交易。

由于solr有这些缺点,有时候nosql是更好的select。

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

通过这种混合方式,您可以真正拥有两全其美的function,例如全文search和快速读取function,同时具有可靠的数据存储,同时具有极高的写入速度。

这是一个技术设置,但有很多的oplog tailers可以集成到solr。 看看这篇文章中做了什么rangespan。

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

我们一起使用MongoDB和Solr,它们performance良好。 你可以在这里find我的博客文章 ,我描述了我们如何一起使用这些技术。 这是一个摘录:

然而,我们观察到,当索引大小增加时,Solr的查询性能下降。 我们意识到最好的解决scheme是同时使用Solr和Mongo DB。 然后,我们将Solr与MongoDB集成,将内容存储到MongoDB中,并使用Solr创build索引进行全文search。 我们只在Solr索引中存储每个文档的唯一标识,并在Solr上search后从MongoDB中检索实际内容。 由于没有分析器,计分等,从MongoDB获取文档比Solr快。[…]

由于没有人提到它,让我补充一点,MongoDB是无模式的,而Solr强制执行一个模式。 所以,如果你的文档的字段可能会改变,这是selectMongoDB而不是Solr的一个原因。

从我两人的经验来看,Mongo非常适合简单,直接的使用。 我们蒙受的主要Mongo缺点是在意料之外的查询上performance不佳(你不能为所有可能的过滤/sorting组合创buildmongo索引,你简单的不能)。

而在这里,Lucene / Solr占据了大部分时间,特别是在FilterQuerycaching方面,性能非常出色。

@ mauricio-scheffer提到Solr 4 – 对于那些感兴趣的人,LucidWorks将Solr 4描述为“NoSQLsearch服务器”,并在http://www.lucidworks.com/webinar-solr-4-the-nosql上有一个videosearch服务器/他们在哪里详细介绍了NoSQL(ish)function。; (-ish是他们的无模式版本,实际上是一个dynamic模式。)

如果你只是想使用键值格式存储数据,不build议使用Lucene,因为它的倒排索引会浪费太多的磁盘空间。 而且随着数据保存在磁盘中,其性能比Redis等NoSQL数据库慢得多,因为redis将数据保存在RAM中。 Lucene的最大优点是它支持很多查询,因此可以支持模糊查询。

第三方的解决scheme,比如mongo操作系统的尾部是有吸引力的。 假设从开发/架构的angular度来看,解决scheme是否可以紧密集成仍然存在一些想法或问题。 我不希望看到这些function紧密集成的解决scheme,原因有几点(有些是推测性的,需要澄清,而不是最新的开发工作):

  • mongo是c ++,lucene / solr是java
  • lucene支持各种文档格式
    • mongo专注于JSON(BSON)
  • lucene使用不可变的文档
    • 单场更新是一个问题,如果它们是可用的
  • lucene索引对于复杂的合并操作是不可变的
  • mongo查询是JavaScript
  • mongo没有文本分析器/标记器(AFAIK)
  • mongo文档大小是有限的,这可能会违背lucene的谷物
  • mongo聚合操作可能在lucene中没有地方
    • lucene可以select在文档中存储字段,但这不是一回事
    • solr以某种方式提供汇总/统计和SQL /graphics查询