2016-07-23 46 views
2

我想使用DataImportHandler保持我的索引与SQL数据库同步(我认为是一个非常香草的事情)。由于我的数据库会很大,我想使用增量导入使用此方法http://wiki.apache.org/solr/DataImportHandlerDeltaQueryViaFullImport,因此调用的格式为http://localhost:8983/solr/Items/dataimport?command=full-import&clean=false。这对于添加项目非常有效。Solr删除与自定义全进口

我有一个单独的DeletedItems表在我的数据库,其中包含已从项删除表,用的时候被一并删除的项目的主键。由于DataImport调用的一部分,我希望能够基于沿

SELECT Id FROM DeletedItems WHERE WasDeletedOn > '${dataimporter.last_index_time}' 

行查询从我的索引中删除相关的项目,但我无法弄清楚如何做到这一点。上面的链接暗指与神秘的

在这种情况下,这意味着,如果你还想使用deletedPkQuery,那么当运行delta-import命令仍然是必要的。

但将deletedPkQuery设置为上述SQL查询似乎不起作用。然后我读到deletedPkQuery只能用于delta导入,所以我不得不向solr服务器发出两个请求,作为同步过程的一部分?这看起来不正确,因为操作由dataimporter.last_index_time属性参数化,该属性发生更改。这两个步骤都需要在一个“原子”行动中完成,当然?有任何想法吗?

回答

0

deletedPkQuery作为对delta-import的常规调用的一部分运行,所以您不必运行任何操作(并且在执行全导入时,不需要运行deletedPkQuery,因为整个连接在清除之前被清除无论如何导入)。

deletedPkQuery应与主要查询配置在相同的元素上。请确保完全匹配字段名称,并且由deletedPkQuery生成的id与主查询提供的id匹配。

a minimal example on solr.pl导入和删除使用相同deleted_entries表结构字段为你在这里:

<entity 
    name="album" 
    query="SELECT * from albums" 
    deletedPkQuery="SELECT deleted_id as id FROM deletes WHERE deleted_at > '${dataimporter.last_index_time}'" 
> 

另外,还要确保deleted_at场的格式是对抗last_index_time产生的价值相媲美。 The default isyyyy-MM-dd HH:mm:ss

..最后,请记住last_index_time属性在第二次任务运行之前不可用,因为在首次填充索引时没有“上一个索引时间”(但deletedPkQuery不应该无论如何,在这之前运行)。

+0

感谢您的答复。尽管我试图避免增量导入,因为他们似乎对deltaQuery查询返回的每个PK发出一个数据库调用(所以总共n + 1个),当时只有一个可以。从Solr文档:“注意:在Solr中更新文档是一种替代方法,在许多情况下,这种方法更加高效,并且需要在http://wiki.apache.org/solr/DataImportHandlerDeltaQueryViaFullImport上解释更少的配置。他们在那里解释的方法对增量导入非常有效,但我无法理解他们打算如何配置删除。 –

+0

请注意,这是一个完全导入的使用,但它*不*清除索引,只是增加/更新文件 –

+0

啊,好点。我错过了那个细节。我想你将不得不发出两个命令 - 一个用于完全导入,然后是一个delta-import以后触发删除。全进口删除通常使用'clean = true'来处理。要使删除工作与DeltaQueryViaFullImport中描述的技术一起使用,您必须手动处理它们(通过删除字段,之后您可以使用deleteByQuery或通过触发删除的增量导入查询进行清除)。你在进口之间删除了多少文件? – MatsLindh

0

必须使用进口处理特殊命令

https://wiki.apache.org/solr/DataImportHandler#Special_Commands

使用这些命令可以改变升压或删除全面导入查询的记录来的文件。请注意,您必须使用$ skipDoc字段来避免文档重新编入索引,并且必须在$ deleteDocById字段中重复该标识。

可以使用联合查询

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}