在Solr dataimport之后运行DELETE清理查询

时间:2017-06-08 14:35:31

标签: sql oracle solr

我正在从Oracle数据库处理Solr dataimport。数据库系统有一组表,专用于存储对其他表中的更改的引用。  例如,我可能有一个名为PERSON的表,当记录添加到此表时,它们的ID将添加到PERSON_CHANGED表中。我想在定义PERSON_CHANGED时使用此deltaQuery表,以便Solr仅索引后续索引中已更改的记录。作为此过程的一部分,我需要删除我在Solr完成导入(delta或full)后从PERSON_CHANGED表中读取的记录,以便我以后不再处理它们。

dataimport之后运行此类“清理”SQL查询的最佳方法是什么?

我尝试过这样的两个查询(简化为简洁):

<dataConfig>
    <dataSource ... >
    <document>
        <entity name="person"
                query="
                    SELECT ID, FIRST_NAME, LAST_NAME
                    FROM PERSON
                    WHERE '${dataimporter.request.clean}' != 'false'
                        OR PERSON_ID IN (
                            SELECT ID FROM CHANGED_PERSON
                        );

                    DELETE * (
                        SELECT * FROM CHANGED_PERSON
                    );
        " />
    </document>
</dataConfig>

但是这会导致SQL command not properly ended错误。 Solr是否提供了进行此类清理的方法?

2 个答案:

答案 0 :(得分:0)

在SOLR中使用delta导入后,solr将不会处理您的记录的两倍,因为每次运行时都会跟踪此记录

参考文档:

  

执行delta-import命令时,它会读取存储的开始时间   在conf / dataimport.properties中。

link:https://wiki.apache.org/solr/DataImportHandler#Delta-Import_Example

作为您问题的一部分,我可以想象您每次运行deltaimport时都尝试执行完全导入(完全导入在solr索引中运行清理等等)。这不是deltaimport的正确方法。

我建议您: 1)执行delta导入(而不是完全导入) 2)每X天一次,X个月,如果需要,执行干净的导入 最好在另一个核心中执行此操作,以便您的服务继续运行,并且您只会替换核心。

答案 1 :(得分:0)

我找到了完成此清理任务的方法,但我对此并不满意。我可以定义一个单独的实体,其查询运行DELETE

<dataConfig>
    <dataSource ... >
    <document>
        <entity name="person"
                query="
                    SELECT ID, FIRST_NAME, LAST_NAME
                    FROM PERSON
                    WHERE '${dataimporter.request.clean}' != 'false'
                        OR PERSON_ID IN (
                            SELECT ID FROM CHANGED_PERSON
                        )" />

        <entity name="deleteChangedPersonRecords"
                query="DELETE FROM CHANGED_PERSON" />
    </document>
</dataConfig>

这似乎有效,但它有点像黑客,它依赖于假设Solr以与文件中指定的顺序相同的顺序执行其实体查询。如果有人有更好的解决方案,请随时添加您对这个问题的答案。