如何在不知道上次修改时间的情况下重新索引Solr中的文档?

时间:2012-08-17 19:58:24

标签: solr

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

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

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

2 个答案:

答案 0 :(得分:1)

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

在这两种情况下,你都会传递?command = full-import,但是对于完全导入,你会传递& clean = true作为URL参数,对于你传递的delta和& clean = false,这会影响从查询返回的记录数,并告诉Solr是否刷新并重新开始。

答案 1 :(得分:0)

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

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

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

但也有一点需要注意:每次运行实体的导入时都需要传递查询参数clean=false;否则,在索引完成后,另一个实体中的文档将被删除。

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