2016-07-23 53 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}