使用Solrsearch索引作为数据库 – 这是“错误的”?
我的团队正在与使用Solr作为search索引的第三方CMS进行合作。 我注意到,似乎作者正在使用Solr作为sorting数据库,每个返回的文档都包含两个字段:
- Solr文档ID(基本上是一个类名和数据库ID)
- 整个对象的XML表示
所以基本上它运行一个针对Solr的search,下载对象的XML表示,然后从XML实例化对象,而不是使用id在数据库中查找它。
我的直觉告诉我这是一个不好的做法。 Solr是一个search索引,而不是数据库…所以对我来说,执行我们对Solr的复杂search,获取文档ID,然后从数据库中拉出相应的行更有意义。
当前的实现是否完美无缺,还是有数据支持重构的时机?
编辑:当我说“XML表示” – 我的意思是一个存储的字段包含所有对象的属性的XMLstring,而不是多个存储的字段。
将Solr用作数据库是非常合理的,具体取决于您的应用程序。 事实上,这几乎是guardian.co.uk正在做的事情 。
这本身绝对不是坏事。 如果你使用的方式不对,就像任何其他级别的工具一样,甚至是GOTO。
当你说“一个XML表示…”时,我假设你正在讨论有多个存储的Solr字段,并使用Solr的XML格式检索这个字段,而不是一个大的XML内容字段(这将是一个可怕的使用Solr) 。 Solr使用XML作为默认响应格式的事实在很大程度上是无关紧要的,您也可以使用二进制协议 ,所以它在这方面与传统的关系数据库相当。
最终,这取决于您的应用程序的需求。 Solr主要是一个文本search引擎,但也可以作为许多应用程序的NoSQL数据库。
是的,你可以使用SOLR作为数据库,但有一些非常严重的警告:
-
SOLR最常用的访问模式,对http的响应并不能很好地响应批量查询。 而且,SOLR不会传输数据—所以你不能懒惰地一次遍历数百万条logging。 这意味着当您使用SOLRdevise大规模数据访问模式时,您必须非常周到。
-
虽然SOLR性能水平(更多的机器,更多的内核等)以及垂直(更多的内存,更好的机器等) 扩展,但与成熟的RDBMS相比 , 其查询能力受到严重限制 。 也就是说,这里有一些很棒的function,比如说现场统计查询,非常方便。
-
由于SOLR在查询中使用filter,因此习惯于使用关系数据库的开发人员在SOLR范例中使用相同的DAOdevise模式时经常遇到问题。 将会有一条学习曲线来开发正确的方法来构build一个使用SOLR进行大型查询或有状态修改的应用程序 。
-
允许高级会话pipe理和许多先进的Web框架(Ruby,Hibernate,…)提供的有状态实体的“企业”工具将被完全抛出窗外 。
-
关系数据库意味着处理复杂的数据和关系 – 因此它们伴随着先进的指标和自动分析工具。 在SOLR中,我发现自己写这样的工具,并手动压力testing很多,这可能是一个时间下沉 。
-
join:这是最大的杀手。 关系数据库支持构build和优化基于简单谓词连接元组的视图和查询的方法。 在SOLR中,没有任何可靠的方法来跨指标连接数据。
-
弹性:为了实现高可用性,SolrCloud使用下面的分布式文件系统(即HCFS)。 这种模式与关系数据库的模式截然不同,后者通常使用从服务器和主服务器或RAID等来实现弹性。 因此,如果您希望它具有可扩展性和抗拒性,您必须准备好提供SOLR所需的弹性基础架构。
这就是说 – 对于某些任务来说,SOLR有很多明显的优势:(见http://wiki.apache.org/solr/WhyUseSolr ) – 松散的查询运行起来更容易,并且返回有意义的结果。 索引是作为默认设置完成的,所以大多数任意查询都运行得非常有效(与RDBMS不同,在这种情况下,经常需要对RDBMS进行优化和解除归一化)。
结论:尽pipe你可以使用SOLR作为关系数据库,但是你可能会发现最终“没有免费的午餐” – 而超酷的lucene文本search和高性能的内存索引,往往是由较less的灵活性和采用新的数据访问工作stream程支付。
这可能是出于性能原因,如果不会造成任何问题,我会离开它。 传统数据库和索引索引应该有一个很大的灰色地带。 我似乎人们做了类似的事情(通常是键值对或JSON而不是XML)用于UI呈现,并且只有在需要更新/删除时才从数据库获取真实对象。 但是所有的内容只是去索尔。
我已经看到类似的事情,因为它允许非常快速的查找。 我们正在将我们的Lucene索引中的数据转移到快速键值存储中,以遵循DRY原则,同时也减小了索引的大小。 这种事情并不是一成不变的。