[英]Best practise to remove stale documents in elasticsearch
我有一个django应用程序,可将模型推入elasticsearch。 保存后我有一个发布信号要更新,但是想写一个批处理命令来更新所有文档。
在此过程中,我想删除变得过时的文档(例如,设置为无效,在数据库中被删除等)。
我开始是这样的:
像这样:
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。
在master
分支(即将发布)中,您只需执行Search().delete()
即可调用delete_by_query
API。
我现在这样做:
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
进一步优化它,但是我不确定细节。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.