我有一个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不是一个选择。
答案 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
进一步优化此功能,但我不确定细节。