我正在从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是否提供了进行此类清理的方法?
答案 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以与文件中指定的顺序相同的顺序执行其实体查询。如果有人有更好的解决方案,请随时添加您对这个问题的答案。