2

在 Solr 中如何处理以下场景DataImportHandler?我们每天对所有文档进行一次完整导入(完整索引运行大约需要 1 小时)。我们所有的文档都分为两类,比如 A 和 B。只有 3% 的文档属于 A 类,并且这些文档经常被修改。我们每 10 分钟通过 deltaQuery 使用修改后的时间重新索引 A 类中的文档。到这里为止一切都很好。

现在,我们还想每小时重新索引一次 A 类中的所有文档(因为我们在不同的表中有一个 view_count 列,并且当我们更新 view_count 时文档修改时间不会改变)。这个怎么做?

更新(短期解决方案):现在我们决定根本不使用增量中的修改时间,而是每 10 分钟重新索引 A 类中的所有文档。索引 A 类文档只需要 3 分钟,所以我们现在可以了。不过,任何解决方案都会有所帮助。

4

2 回答 2

1

我没有在您的 DIH DB 配置中使用单独的查询和 deltaQuery 参数,而是选择遵循此处找到的建议,这允许您通过将不同的参数传递给 Solr 来执行完全导入,从而对完全和部分更新使用相同的查询逻辑或增量导入。

在这两种情况下,您都将传递 ?command=full-import,但对于完全导入,您将传递 &clean=true 作为 URL 参数,对于增量,您将传递 &clean=false,这将影响从查询并告诉 Solr 是否刷新并重新开始。

于 2012-08-19T21:02:16.433 回答
0

我发现可以使用ExternalFileField存储视图计数并使用函数查询根据该字段对结果进行排序。(我在 SO: ExternalFileField in Solr 3.6上问了另一个问题。)但是,我发现这些字段无法在 Solr 结果集中返回,这意味着我需要进行数据库调用来获取字段的值。我不想那样做。

找到了一个替代解决方案:当试图理解 Mike Klostermeyer 的答案时,我发现command=full-import还可以使用一个额外的查询参数:entity<document>所以现在我在标签中设置了两个顶级实体data-config.xml- 第一个只会索引 A 类中的文档,第二个只会索引 B 类中的文档。对于 A 类文档,我们根据上次修改的内容进行增量导入每 5 分钟一次,每小时一次完全导入(以更新 view_count)。对于 B 类文档,我们每天只进行一次完全导入,不进行增量导入。

这实质上给出了三种不同的执行计划,以不同的时间间隔运行。

不过还有一个警告:clean=false每次运行实体导入时都需要传递查询参数;否则索引完成后其他实体中的文档将被删除。

我不喜欢这种方法的一件事是将所有查询和子实体从一个顶级实体复制粘贴到另一个。顶级实体中的查询之间的唯一区别是文档是属于 A 类还是 B 类。

于 2012-08-20T19:58:50.250 回答