删除elasticsearch中过时文档的最佳实践

时间:2017-03-24 09:02:59

标签: python django elasticsearch elasticsearch-dsl elasticsearch-py

我有一个django应用程序,可以将模型推送到elasticsearch中。保存后我有一个要更新的帖子信号,但是想写一个更新所有文件的批处理命令。

在此过程中,我想删除过时的文档(例如,在数据库中设置为非活动状态,已删除等)。

我从这样的事情开始:

  • 更新所有文档并存储更新/创建的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不是一个选择。

2 个答案:

答案 0 :(得分:1)

0.1分支中(即将发布,您只需执行master即可调用Search().delete() API。

答案 1 :(得分: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进一步优化此功能,但我不确定细节。