1

处理从现有规范化 mssql 数据库导入 Solr 增量数据。我无法决定我需要实施的策略,或者不知道是否有现有的工具可以做同样的事情,所以我不需要重新发明轮子。

我需要将一个文档导入 Solr 3.6 以构建一个 Solr 数据,该数据以高度规范化的方式保存在 MSSQL 中。要检索单个文档的数据,需要许多连接,这会降低性能。我有appx。db 中有 100 万个此类文档。所以完全导入 Solr 对我来说不是一个选择。

在决定方法时,我有两个问题需要考虑:

  • 增量数据导入,使 SQL Server 在从 db 获取数据时不会有很重的负载。
  • 每天一次将 SQL Server 中已更改的数据更新为 Solr 数据

我正在寻求您在决定将增量数据导入 Solr 的策略和工具方面的帮助。我想,我有以下选择:

  1. 自定义开发应用程序以从 MSSQL 获取数据并将其传递给 Solr。我需要跟踪数据,因为所有记录都插入到 Solr 中以及待处理的记录。同样,MSSQL 中 2% 的数据记录每天都在更新,因此需要跟踪自那时以来哪些数据发生了变化,然后在某个时间点再次将它们更新到 Solr。

  2. 使用 Solr 中的任何现有工具或实用程序来执行相同的操作,例如 DIH。我不确定这将如何解决增量数据检索的问题以及它将如何跟踪 SQL Server 中哪些数据发生了变化?同样,不确定 DIH 将如何处理需要从 db 获取数据的复杂连接。

  3. 或者在 DIH 中使用 Lusql 之类的东西,但仍然不确定它将如何解决这两个问题。虽然 Lusql 将提供在 db 中进行复杂连接的能力,但我希望这可能符合我的目的。

我赞成在 Solr 中使用 LuSQL 和 DIH,如果它可以满足目的,但仍然不确定它如何跟踪哪些数据发生了变化?或者对于这一部分,我必须通过维护进行更改的文档 ID 来手动管理,然后将其提供给 LuSQL 以从 SQL 获取数据并导入到 Solr。

我也期待您提出除此之外的建议来处理这种情况。

4

2 回答 2

2

我将与您分享我这样做的方式。

主要是我有相同的要求,直到本周我使用 solr dataimport 和增量导入。我有一个程序,它会定期将新项目的状态从 0 更新到 1,然后调用 solr data import 来获取所有状态为 1 的文档。 Solrdataimport 使用存储过程来加入并从 db 获取状态为 1 的文档。如果导入成功完成,我会将状态更新为 2,并且我知道该文档在 solr 中。如果文档发生更改,我只需从状态 2 更改为状态 0,然后导入过程会更新 solr 中的文档。

使用此过程对我来说一切正常。我总是在 solr 中获取新文档,而无需从数据库中获取所有数据。

现在我的要求发生了变化,因为我们决定将日期存档在数据库中,因为我们只需要在 solr 中。所以我需要一个反序列化数据的程序,然后将其发送到 solr。

我现在的方法是通过更新处理程序添加所有新的/更新的文档,在我添加所有文档以提交它们之后,如果提交成功,那么我更新数据库中的状态。使用这种方法我还没有经验,所以我不知道它是否会起作用,但我会尝试看看会发生什么。

我过去研究了一种更好的方法来做到这一点,但我找不到任何东西,所以如果你找到更好的解决方案,请与我分享。

祝你好运 :)

于 2012-06-22T10:57:51.417 回答
1

我们必须从具有 25 多个表的高度规范化模式中建立索引,其中一半包含超过 5M 的记录。最大~20M。

我们使用 informatica 将这些记录从 oracle 加载到 solr。像 informatica 这样的 ETL 工具提供了在关系数据库之外连接表/查询结果的方法。它有一个排序器转换来排序侧数据库。按 db 之外的记录分组的聚合转换。还有一个查找转换..

本质上,我们的数据是分阶段去规范化的,加载/索引过程是分布式的。

当然也有开源 ETL 工具。有一个 Microsoft ETL 工具..

对 solr 的索引是通过更新处理程序进行的。增量索引与完整索引非常相似,具有用于更改数据捕获的附加逻辑。ETL 活动已安排。

于 2012-06-23T23:29:01.437 回答