2014-08-28 50 views
0

我有兩個表按列「product_code」加入。solr delta導入處理刪除文檔

  1. 產品
  2. product_retailer_map

我的SQL查詢:SELECT *產品,COUNT(product_retailer_map.product_code)FROM產品LEFT JOIN product_retailer_map ON product_retailer_map.product_code = products.product_code GROUP BY products.product_code

每當我添加新零售商並執行delta導入,solr正確更新文檔。 每當我添加新產品並執行增量導入,solr正確更新文檔

但是無論何時我刪除零售商並執行delta導入,solr 不要更新文檔。 此外,每當我刪除產品並執行增量導入,索爾不要更新文件。

我還沒有配置deletedPkQuery因爲我很困惑如何處理2個單獨的刪除。

編輯

< entity name="products" 

query="SELECT p.*, COUNT(map.product_code) AS cnt, SUM(CASE WHEN map.retailer_availability > 0 THEN 1 ELSE 0 END) AS available_cnt FROM products AS p LEFT JOIN product_retailer_map AS map ON map.product_code = p.product_code GROUP BY p.product_code ORDER BY available_cnt DESC" 

deltaImportQuery="SELECT p.*, COUNT(map.product_code) AS cnt, SUM(CASE WHEN map.retailer_availability > 0 THEN 1 ELSE 0 END) AS available_cnt FROM products AS p LEFT JOIN product_retailer_map AS map ON map.product_code = p.product_code WHERE p.product_id = '${dataimporter.delta.product_id}' GROUP BY p.product_code ORDER BY available_cnt DESC" 

deltaQuery="SELECT `product_id` FROM `products` WHERE (product_id IN (SELECT product_id FROM products WHERE product_code IN (SELECT DISTINCT product_code FROM product_retailer_map WHERE updated_at > '${dataimporter.last_index_time}'))) OR (updated_at > '${dataimporter.last_index_time}')" 
> 

      <field column="product_id" name="product_id"/> 
      <field column="product_code" name="product_code"/> 
      <field column="product_name" name="product_name"/> 
      <field column="cnt" name="cnt"/> 
      <field column="available_cnt" name="available_cnt"/> 

     </entity > 

請建議,如果我做錯了。

另外,我認爲如果我使用2個實體,那麼我可以寫2刪除查詢,並可能是問題將得到正確解決。

你認爲?

+0

你可以發佈你的數據配置嗎?這是XML的一部分,你有所有的查詢和實體... – cheffe 2014-08-29 07:45:55

+0

張貼我的數據配置作爲答案,因爲它超過660個字符。 – 2014-09-03 17:20:47

+0

我已將您的編輯從問題的答案中移除,在問題下方有一個編輯按鈕,您應該使用該編輯按鈕,而不是回答:) – cheffe 2014-09-04 11:27:04

回答

0

當您刪除產品時,您的增量查詢不會捕獲刪除,因爲產品不再存在於表中。您需要爲此使用deletedPkQuery。您需要在數據庫中有一個日誌表或類似的文件才能從中進行選擇,因爲您無法再從產品表中選擇產品的主鍵。例如:

SELECT product_id 
FROM LogProductDeletion 
WHERE deleted_stamp > '${dataimporter.last_index_time}' 

當您刪除零售商時需要做什麼?這是否會導致產品從Solr中刪除?如果是這樣,您可以在您的deletedPkQuery中使用UNION來獲取零售商已被刪除的產品的主鍵。同樣,您需要訪問日誌表以刪除零售商,因爲您無法再從其表中選擇零售商。