2

我正在尝试使用 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属性会发生变化。当然,这两个步骤都需要在一个“原子”动作中完成?有任何想法吗?

4

2 回答 2

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}
于 2017-02-16T09:56:47.920 回答
0

deletedPkQuery是作为对 的常规调用的一部分运行的,delta-import因此您不必运行任何两次(并且在进行完全导入时,无需运行 deletedPkQuery,因为无论如何在导入之前整个连接都已清除)。

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

solr.pl 上有一个最小示例,用于使用与此处相同的 deleted_entries-table 结构导入和删除字段:

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

还要确保 deleted_at-field 的格式与last_index_time. 默认值为 yyyy-MM-dd HH:mm:ss.

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

于 2016-07-23T19:24:16.377 回答