0

我们正在使用 Solr 5.0.0。delta导入配置很简单,就像apache-wiki一样

我们设置了 cron 作业,每 30 分钟执行一次增量导入,设置也很简单:

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

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

SOLR 是否在并行线程中启动下一个增量导入?或者在前一个完成之前忽略工作?

在 cron 调度程序中延长时间不是一种选择,因为随着用户和文档数量随着时间的推移而增加,可能会发生类似的问题......

4

2 回答 2

0

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

这是我如何解决它的方法。

注意:我已经用核心实现了 solr。

我有一张表,其中保存了有关 solr 的信息,例如核心名称、上次重新索引日期和需要重新索引的 current_status。

我已经编写了一个调度程序,它检查上表中哪些所有内核需要重新索引(增量导入)并启动重新索引。

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

当我开始重新索引时,还会更新表并将特定核心的状态标记为“进行中”。

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

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

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");

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

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

此外,它只考虑那些用于重新索引的核心,其中有一些更新(可以通过标志“re-indexing-required”标识)。

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

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

我希望这可以帮助你。

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

于 2015-05-28T14:33:42.950 回答
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 字段。但是对于 TableB 的每一行,向 db 发出一个请求。我使用 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,

Al 花哨的连接和联合进入 tableB 中的 clouse 以及 tableA 中的很多连接。其实这个观点一共占据了20万场。

solr 映射是这样的:

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

希望它可以帮助某人。

于 2020-07-16T14:21:33.390 回答