0

我有一个将模型推送到elasticsearch的django应用程序。我有一个后保存更新后的信号,但想写一个更新所有文档的批处理命令。弹性搜索中删除陈旧文档的最佳做法

在这个过程中,我想删除变成陈旧的文档(例如,在数据库中设置为不活动,被删除等)。

我开始是这样的:

  • 更新所有文件和存储更新/创建的ID。
  • 创建一个巨大的排除查询
  • 删除那些匹配

事情是这样的所有文件:

for i in updated_ids: 
    q = Q('match', **{'id': i}) 
    f = f | q if f else q 
queryset = dt.search().query(Bool(filter=[~Q(f)])) 
for stale in queryset.scan(): 
    stale.delete() 

但查询变得漫长而失败。

我不知道是否有更有效的方法来做到这一点。

我在elasticsearch.py​​上使用elasticsearch-dsl。 Django-Haystack不是一种选择。

+0

为什么更新所有的文件,你的意思是说,即使单个文档的更新,你做的批量更新。 – user3775217

回答

0

我现在做这样的:

for dt, updated_ids in self.updated.items(): 
    existing_ids_in_index = [d.id for d in dt.search().scan()] 
    stale_ids = list(set(existing_ids_in_index) - set(updated_ids)) 
    for stale_id in stale_ids: 
     dt.find_one('id', stale_id).delete() 
    print("... {}: Removed {}.".format(dt.get_model().__name__, len(stale_ids))) 

我会还与delete_by_query优化这一点,但我不能确定有关的细节。

1

master分支(将很快发布,你可以做Search().delete()调用delete_by_query API。

+0

在查询集上调用? – shredding

+0

'delete'是'Search'对象上的一种新方法。 –

+0

但是,如何通过查询/限制要删除的东西? – shredding