Java 使用Solr搜索索引作为数据库-这是;“错了吗?”;?

Java 使用Solr搜索索引作为数据库-这是;“错了吗?”;?,java,mysql,database,solr,Java,Mysql,Database,Solr,我的团队正在与使用Solr作为搜索索引的第三方CMS合作。我注意到,作者似乎将Solr用作某种数据库,因为返回的每个文档都包含两个字段: Solr文档ID(基本上是类名和数据库ID) 整个对象的XML表示形式 因此,它基本上是对Solr进行搜索,下载对象的XML表示,然后从XML实例化对象,而不是使用id在数据库中查找对象 我的直觉告诉我这是一个糟糕的做法。Solr是一个搜索索引,而不是数据库。。。因此,对我来说,对Solr执行复杂的搜索,获取文档ID,然后从数据库中取出相应的行更有意义 当前的

我的团队正在与使用Solr作为搜索索引的第三方CMS合作。我注意到,作者似乎将Solr用作某种数据库,因为返回的每个文档都包含两个字段:

  • Solr文档ID(基本上是类名和数据库ID)
  • 整个对象的XML表示形式
  • 因此,它基本上是对Solr进行搜索,下载对象的XML表示,然后从XML实例化对象,而不是使用id在数据库中查找对象

    我的直觉告诉我这是一个糟糕的做法。Solr是一个搜索索引,而不是数据库。。。因此,对我来说,对Solr执行复杂的搜索,获取文档ID,然后从数据库中取出相应的行更有意义

    当前的实现是否完美可靠,或者是否有数据支持重构时机已经成熟的想法


    编辑:当我说“XML表示法”时,我指的是一个存储字段,其中包含对象所有属性的XML字符串,而不是多个存储字段。

    这可能是出于性能原因,如果它不会引起任何问题,我将不去管它。传统数据库与solr索引之间存在很大的灰色地带。我觉得人们在UI展示中也会做类似的事情(通常是键值对或json而不是xml),只有在需要更新/删除时才从数据库中获取真实对象。但是,所有的读取都只需转到Solr即可。

    我见过类似的操作,因为它允许非常快速的查找。我们正在将数据从Lucene索引移动到快速键值存储中,以遵循DRY原则,同时减小索引的大小。对于这类事情没有硬性规定。

    将Solr用作数据库是完全合理的,这取决于您的应用程序。事实上,差不多就是这样

    这本身绝对不是一个坏习惯。只有当你用错了它,就像其他任何级别的工具一样,即使是GOTOs,它才是糟糕的

    当您说“一个XML表示…”时,我假设您所说的是有多个存储的Solr字段,并使用Solr的XML格式检索这些字段,而不仅仅是一个大的XML内容字段(这将是Solr的一个可怕的用法)。Solr使用XML作为默认响应格式的事实在很大程度上是不相关的,您也可以使用,因此它在这方面与传统关系数据库相当


    最终,它取决于应用程序的需要。Solr主要是一个文本搜索引擎,但也可以作为许多应用程序的NoSQL数据库。

    是的,您可以将Solr用作数据库,但有一些非常严重的警告:

  • SOLR最常见的访问模式是通过http,它对批处理查询的响应不是特别好。此外,SOLR不会流式传输数据——因此您不能一次懒洋洋地遍历数百万条记录这意味着您在使用SOLR设计大规模数据访问模式时必须非常深思熟虑。

  • 尽管SOLR的性能水平扩展(更多的机器、更多的内核等)以及垂直扩展(更多的RAM、更好的机器等),与成熟的RDBMS相比,其查询能力受到严重限制。也就是说,有一些非常好的函数,比如字段统计查询,非常方便

  • 习惯于使用关系数据库的开发人员在SOLR范例中使用相同的DAO设计模式时经常会遇到问题,因为SOLR在查询中使用过滤器的方式将有一个学习曲线,用于开发正确的方法来构建一个应用程序,该应用程序将使用SOLR进行部分大型查询或全状态修改

  • 许多高级web框架(Ruby、Hibernate等)提供的支持高级会话管理和全状态实体的“企业”工具将不得不被完全抛弃

  • 关系数据库旨在处理复杂的数据和关系,因此,它们伴随着最先进的度量和自动化分析工具在SOLR中,我发现自己编写了很多这样的工具并手动进行压力测试,这可能是一个时间消耗

  • 加入:这是个大杀手。关系数据库支持用于构建和优化基于简单谓词连接元组的视图和查询的方法在SOLR中,没有任何可靠的方法可以跨索引连接数据。

  • 弹性:为了实现高可用性,SolrCloud在底层使用分布式文件系统(即HCFS)。此模型与关系数据库的模型大不相同,关系数据库通常使用从数据库和主数据库或RAID等实现弹性。因此,如果您希望SOLR的基础设施具有云可伸缩性和抗干扰性,那么您必须准备好提供SOLR所需的弹性基础设施

  • 也就是说,对于某些任务,SOLR有很多明显的优势:(参见)——松散查询更容易运行并返回有意义的结果。索引是默认情况下完成的,因此大多数任意查询都可以非常有效地运行(与RDBMS不同,RDBMS通常需要在事后进行优化和反规范化)


    结论:即使您可以将SOLR用作RDBMS,您可能会发现(正如我所做的那样)最终“没有免费午餐”——超级酷的lucene文本搜索和高性能内存索引的成本节约,灵活性降低和采用新的数据访问工作流程通常会带来成本。

    将solar作为数据库添加到@Jayunit100响应中,您可以获得可用性和分区容差,但需要付出一定的一致性代价。在你写的东西和你能读回它的时间之间会有一个可配置的延迟