繁体   English   中英

在Elasticsearch中删除陈旧文档的最佳实践

[英]Best practise to remove stale documents in elasticsearch

我有一个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。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM