solr delta导入处理删除文档

时间:2014-08-28 20:50:27

标签: solr document

我有两个表由“product_code”列连接。

  1. 产品
  2. product_retailer_map
  3. 我的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会更新文档正确。 每当我添加新产品并执行delta导入时, solr会正确更新文档

    但是,只要我删除零售商并执行delta导入,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个删除查询,可能会出现问题,这将得到正确解决。

    你的想法??

1 个答案:

答案 0 :(得分:0)

删除产品时,delta查询将无法捕获删除,因为表中不再存在该产品。您需要为此使用deletedPkQuery。您需要在数据库中有一个日志表或类似的选项,因为您无法再从products表中选择产品的主键。像这样:

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

删除零售商时需要做什么?这会导致产品从Solr中删除吗?如果是这样,您可以在deletedPkQuery中使用UNION来获取已删除零售商的产品的主键。同样,您需要访问日志表以便删除零售商,因为您无法再从其表中选择零售商。