0

我有一个将模型推送到弹性搜索的 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 不是一个选项。

4

2 回答 2

1

master分支中(即将发布,您只需Search().delete()调用delete_by_queryAPI。

于 2017-03-24T14:38:05.907 回答
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)))

我可以用 a 进一步优化它,delete_by_query但我不确定细节。

于 2017-03-24T09:58:17.497 回答