当前位置: 首页 > 面试题库 >

使用Solr搜索索引作为数据库-这是“错误的”吗?

湛光明
2023-03-14
问题内容

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

  1. Solr文档ID(基本上是类名和数据库ID)
  2. 整个对象的XML表示形式

因此,基本上,它针对Solr运行搜索,下载对象的XML表示,然后从XML实例化对象,而不是使用id在数据库中查找对象。

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

当前的实现完美无缺,还是有数据支持重构的时机成熟的想法?

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


问题答案:

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

  1. SOLR最常见的访问模式(通过HTTP)对批查询的响应不是特别好。此外,SOLR不会流数据—因此您不能一次一次地遍历数百万条记录。 这意味着在使用SOLR设计大规模数据访问模式时必须非常谨慎。

  2. 尽管SOLR性能在水平方向(更多机器,更多核等)和垂直方向(更多RAM,更好的机器等)上 扩展,但与成熟的RDBMS相比其查询功能受到严重限制 。也就是说,有一些出色的功能,例如字段统计查询,非常方便。

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

  4. 允许 高级会话管理和许多高级Web框架(Ruby,Hibernate等)提供的全状态实体 的“企业”工具 必须完全扔掉

  5. 关系数据库旨在处理复杂的数据和关系-因此,它们伴随着最新的指标和自动分析工具。 在SOLR中,我发现自己编写了这样的工具并进行了大量的手动压力测试,这可能会浪费时间

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

  7. 弹性:为了获得高可用性,SolrCloud使用下面的分布式文件系统(即HCFS)。此模型与关系数据库的模型完全不同,后者通常使用从属服务器和主服务器或RAID等来实现弹性。因此,如果您希望SOLR具有可伸缩性和可扩展性,则必须准备提供SOLR所需的弹性基础架构。

就是说-
SOLR对于某些任务有很多明显的优势:(请参阅http://wiki.apache.org/solr/WhyUseSolr)-松散查询更容易运行并返回有意义的结果。索引是默认情况下进行的操作,因此大多数任意查询都可以非常有效地运行(与RDBMS不同,在RDBMS之后,您通常必须对事实进行优化和反规范化)。

结论:
即使可以将SOLR用作RDBMS,您也可能发现(如我所知)最终“没有免费的午餐”,并且节省了超酷的lucene文本搜索和高性能的内存中的成本索引编制通常是由于灵活性较低和采用新的数据访问工作流而付出的。



 类似资料:
  • 我正在遵循django文档将solr与Django-Oscar集成。我在尝试重建索引时遇到以下错误。我如何解决这个问题?

  • 主要内容:在Apache Solr中的索引,使用Post命令添加文档,使用Solr Web界面添加文档,使用Java Client API添加文档一般来说,索引是系统地排列文档或(其他实体)。索引使用户能够在文档中快速地查找信息。 索引集合,解析和存储文档。 索引是为了在查找所需文档时提高搜索查询的速度和性能。 在Apache Solr中的索引 在Apache Solr中,我们可以索引(添加,删除,修改)各种文档格式,如xml,csv,pdf等。可以通过几种方式向Solr索引添加数据。 在本章中

  • 主要内容:搜索引擎组件,搜索引擎是如何工作的?搜索引擎是指一个庞大的互联网资源数据库,如网页,新闻组,程序,图像等。它有助于在万维网上定位信息。 用户可以通过以关键字或短语的形式将查询传递到搜索引擎中来搜索信息。 搜索引擎然后搜索其数据库并向用户返回相关链接。 比如下面常用到两个搜索引擎 - 百度 谷歌 搜索引擎组件 一般来说,搜索引擎有三个基本组件,如下所列 - Web爬虫 - Web爬虫也称为蜘蛛或机器人。 它是一个收集网络信息的软件组件

  • 我正在使用: neo4j 2.0。1 我有一个具有属性名称的节点人员,我想用Lucene语法搜索该属性。我在我的存储库中使用findByNamelike方法,它非常适合像value*或*value或*etc这样的查询。 但是我需要这样的查询{A*TO D*}。我发现了一个弃用的方法findAllByQuery(名称,查询),用这个方法我可以实现我的需求。 > 我还注意到,如果我从cypher创建节

  • 如果不需要打开shell执行create index,直接在程序源代码里就能指定数据库索引,是不是很酷? 是的,利用bugu-mongo,你只需在程序里加上个@EnsureIndex注解,即可实现该功能。 以一个简单的新闻系统为例: @Entity @EnsureIndex("{type:1}") public class News implements BuguEntity{ @Id

  • 在本章中,我们将讨论如何使用Java Client API检索数据。假设有一个名为sample.csv的.csv文档,其中包含以下内容。 可以使用命令在核心-下对此数据编制索引。 以下是向Apache Solr索引添加文档的Java程序代码。将此代码保存在的文件中。 通过在终端中执行以下命令编译上述代码 - 执行上述命令后,将得到以下输出。