SOLR Delta导入所需的时间比下一个预定的delta导入cron作业要长

时间:2015-05-28 13:54:44

标签: solr5

我们正在使用Solr 5.0.0。 Delta导入配置非常简单,就像apache-wiki

一样

我们已经设置了cron作业,每隔30分钟进行delta-imports,简单设置:

0,30 * * * * /usr/bin/wget http://<solr_host>:8983/solr/<core_name>/dataimport?command=delta-import 

现在,如果有时当前运行delta-import的时间比下一个计划的chron作业要长,会发生什么?

SOLR是否在并行线程中启动下一个delta-import?或者在上一个工作完成之前忽略工作?

在cron调度程序中延长时间不是一个选项,因为随着时间的推移用户和文档编号的增加会出现类似的问题......

2 个答案:

答案 0 :(得分:0)

我最后遇到了类似的问题。

以下是我如何解决这个问题。

注意:我已经使用core实现了solr。

我有一个表,其中我保存了关于solr的信息,如核心名称,最后重新索引日期和重新索引所需,current_status。

我编写了一个调度程序,它从上表中检查所有内核需要重新索引(delta-import)并启动重新索引。

每20分钟(在30分钟内)发送/调用重新索引请求。

当我开始重新索引时也更新表并将特定核心的状态标记为“inprogress”。

十分钟后,我发出请求,检查重新索引是否完成。

为了检查重新索引,我将请求用作:

final URL url = new URL(SOLR_INDEX_SERVER_PROTOCOL, SOLR_INDEX_SERVER_IP, Integer.valueOf(SOLR_INDEX_SERVER_PORT),
                    "/solr/"+ core_name +"/select?qt=/dataimport&command=status");

检查Committed或idle的状态,并将其视为重新索引已完成,并将其状态标记为表中的空闲状态。

因此,重新索引调度程序不会选择处于进入状态的核心。

此外,它只考虑那些核心用于重新索引哪里有一些更新(可以通过标记“re-indexing-required”来识别)。

仅当re-indexing-required为true且当前状态为空闲时,才会调用重新索引。

如果有一些更新(由“re-indexing-required”标识)但current_status是进展的,则调度程序不会选择它进行重新索引。

我希望这对你有所帮助。

注意:我使用DIH进行索引和重新索引。

答案 1 :(得分:0)

Solr会简单地忽略下一个导入请求,直到第一个导入请求结束为止,并且不会缓存第二个导入请求。我可以观察到这种行为,并且已经在某处阅读过它,但现在找不到它。

事实上,我正在处理相同的问题。我尝试优化查询:

deltaImportQuery="select * from Assests where ID='${dih.delta.ID}'"
            deltaQuery="select [ID] from Assests where date_created &gt; '${dih.last_index_time}' "

我只第一手检索了ID字段,然后尝试检索预期的文档。 您也可以指定字段而不是'*'符号。由于我使用视图,因此不适用于我的情况
如果有其他解决方案,我将进行更新。

解决后编辑

除了以上建议的请求外,我再更改一个,以为将索引编制过程加快了10倍。我嵌套了两个大实体。我在另一个像

中使用了实体
  <entity name="TableA"  query="select * from TableA"> 
       <entity name="TableB"  query="select * from TableB where TableB.TableA_ID='${TableA.ID}'" >

哪个产生多值tableB字段。但是对于每一行,都向db发出了针对TableB的请求。 我使用了with子句和逗号分隔的字段值来更改视图。并解析来自solr字段映射的值。并将其索引到多值字段中。

我的整个索引编制过程从几小时加速到几分钟。下面是我的视图和solr映射配置。

WITH tableb_with as (SELECT * from TableB)
    SELECT *,STUFF( (SELECT ',' +   REPLACE( fieldb1, ',', ';') from tableb_with where  tableb_with.tableA.ID = tableA.ID 
                                            for xml path(''), type).value('.', 'varchar(max)') , 1, 1, '') AS field2WithComma,
    STUFF( (SELECT ',' +   REPLACE( fieldb1, ',', ';') from tableb_with where  tableb_with.tableA.ID = tableA.ID 
                                            for xml path(''), type).value('.', 'varchar(max)') , 1, 1, '') AS field2WithComma,

花哨的连接和联合在表B中与Clouse一起使用,在表A中也包含许多联接。实际上,此视图总共包含200场。

solr映射是这样的:

<field column="field1WithComma" name="field1" splitBy=","/>

希望它可以帮助某人。