【发布时间】:2011-01-06 22:42:01
【问题描述】:
我正在使用 DataImportHandler 在 SOLR 中索引数据。我使用完全导入来索引数据库中大约 10000 个产品的所有数据。现在我对 delta-import 的使用感到困惑?它是否会按时间间隔索引添加到数据库中的新数据,我的意思是它将索引添加到我的表中大约 10 行的新数据,或者它只是更新已索引数据中的更改。
谁能尽快用简单的例子给我解释一下。
【问题讨论】:
我正在使用 DataImportHandler 在 SOLR 中索引数据。我使用完全导入来索引数据库中大约 10000 个产品的所有数据。现在我对 delta-import 的使用感到困惑?它是否会按时间间隔索引添加到数据库中的新数据,我的意思是它将索引添加到我的表中大约 10 行的新数据,或者它只是更新已索引数据中的更改。
谁能尽快用简单的例子给我解释一下。
【问题讨论】:
DataImportHandler 可能有点令人生畏。您的初始查询已加载 10.000 个唯一产品。如果您指定 /dataimport?command=full-import,则会加载此文件。 完成此导入后,DIH 会存储一个变量 ({dataimporter.last_index_time}),它是您进行此导入的最后日期/时间。
为了进行更新,您需要指定一个 deltaQuery。 deltaQuery 旨在识别自上次更新以来数据库中已更改的记录。因此,您指定这样的查询:SELECT product_id 从某个表 WHERE [date_update] >= '${dataimporter.last_index_time}' 这将从您的数据库中检索自上次完全更新以来更新的所有 product_id。您需要指定的下一个查询 (deltaImportQuery) 是检索您在上一步中拥有的每个 product_id 的完整记录的查询。
假设 product_id 是您的唯一键,solr 会发现它需要更新现有记录,或者如果 product_id 不起作用则添加一条记录。
为了执行 deltaQuery 和 deltaImportQuery,您使用 /dataimport?command=delta-import
这是对所有可能性的极大简化,请查看 DataImportHandler 上的 Solr wiki,它是一个非常强大的工具!
【讨论】:
另外说明:
当您在较小的时间窗口内使用增量导入(例如几秒钟内几次)并且数据库服务器位于 solr 索引服务之外的另一台机器上时,请确保两台机器的 systemtime匹配,因为[date_update]的时间戳是在数据库服务器上生成的,而dataimporter.last_index_time是在另一个服务器上生成的。
否则,您将不会根据时差更新索引(或更新太多)。
【讨论】:
我同意数据导入处理程序可以处理这种情况。 DIH 的一个重要限制是它不对请求进行排队。这样做的结果是,如果 DIH 正在“忙”索引,它将忽略所有未来的 DIH 请求,直到它再次“空闲”。跳过的 DIH 请求会丢失,不会被执行。
【讨论】: