我试图使用DataImportHandler来使我的索引与SQL数据库保持同步(我认为这是一件非常普遍的事情)。由于我的数据库非常大,我想使用此方法http://wiki.apache.org/solr/DataImportHandlerDeltaQueryViaFullImport使用增量导入,因此调用的格式为http://localhost:8983/solr/Items/dataimport?command=full-import&clean=false
。这非常适合添加项目。
我的数据库中有一个单独的 DeletedItems 表,其中包含已从 Items 表中删除的项目的主键以及删除它们的时间。作为DataImport调用的一部分,我曾希望能够根据
的查询从我的索引中删除相关项目。SELECT Id FROM DeletedItems WHERE WasDeletedOn > '${dataimporter.last_index_time}'
但我无法弄清楚如何做到这一点。上面的链接暗示了神秘的
在这种情况下,显然意味着如果您还想使用deletedPkQuery,那么仍然需要运行delta-import命令。
但将deletedPkQuery设置为上述SQL查询似乎不起作用。然后我读到deletedPkQuery只适用于delta-imports,所以我被迫在同步过程中向我的solr服务器发出两个请求?这似乎是正确的,因为操作是由dataimporter.last_index_time
属性参数化的,它会发生变化。这两个步骤都需要在一个" atomic"行动,当然?有什么想法吗?
答案 0 :(得分:1)
您必须使用导入处理程序特殊命令
https://wiki.apache.org/solr/DataImportHandler#Special_Commands
使用这些命令,您可以更改提升或删除来自完整导入查询的记录集的文档。请注意,必须使用$ skipDoc字段以避免再次索引文档,并且必须在$ deleteDocById字段中重复id。
您可以使用联合查询
select
id,
text,
'false' as [$deleteDocById],
'false' as [$skipDoc]
from [rows to update or add]
Union Select
id,
'' as text,
id as [$deleteDocById],
true as [$skipDoc]
或
的情况select
id,
text,
CASE
when deleted = 1 then id
else 'false'
END as [$deleteDocById],
CASE
when deleted = 1 then 'true'
else 'false'
END as [$skipDoc]
Where updated > ${dih.last_index_time}
答案 1 :(得分:0)
deletedPkQuery
作为常规调用delta-import
的一部分运行,因此您不必运行任何两次(并且在执行完全导入时,不需要运行deletedPkQuery,因为无论如何都要在导入之前清除整个连接。)
应在与主查询相同的元素上配置deletedPkQuery
。确保完全匹配字段名称,并且deletedPkQuery生成的id
与主查询提供的<entity
name="album"
query="SELECT * from albums"
deletedPkQuery="SELECT deleted_id as id FROM deletes WHERE deleted_at > '${dataimporter.last_index_time}'"
>
匹配。
使用与此处相同的deleted_entries-table结构导入和删除字段a minimal example on solr.pl:
last_index_time
还要确保deleted_at-field的格式与yyyy-MM-dd HH:mm:ss
生成的值相当。 The default is last_index_time
。
..最后,请记住deletedPkQuery
属性在第二次运行任务之前不可用,因为第一次填充索引时没有“上一个索引时间”(但是{ {1}}不应该在此之前运行。)