0

我有一個將模型推送到elasticsearch的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不是一種選擇。

+0

爲什麼更新所有的文件,你的意思是說,即使單個文檔的更新,你做的批量更新。 – user3775217

回答

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優化這一點,但我不能確定有關的細節。

1

master分支(將很快發佈,你可以做Search().delete()調用delete_by_query API。

+0

在查詢集上調用? – shredding

+0

'delete'是'Search'對象上的一種新方法。 –

+0

但是,如何通過查詢/限制要刪除的東西? – shredding