2013-03-28 46 views
0

當我最初爲我們的數據存儲編寫delete方法時,我搞砸了,並忘記從search.Index中刪除實體ID。現在我發現搜索結果會帶回doc_ids,但數據存儲中不存在關聯數據。如何同步NDB搜索索引與數據存儲

我想遍歷所有索引文件並刪除那些沒有關聯數據的文件。

我想我可以做這樣的事情:

docs = videos.Index.search('').results 
doc_ids = [x.doc_id for x in docs] 
keys = [ndb.Key(urlsafe=x) for x in doc_ids] 
entities = [key.get() for key in keys] 

nones = [] 
for idx, i, in enumerate(entities): 
    if i == None: nones.append(idx) 

for i in nones: 
    videos.Index.delete(doc_ids[i]) 

我想知道如果有一個sync方法或我丟失的東西?此外videos.Index.search('')肯定是不正確的,因爲我認爲它是多次返回相同的實體,因爲它匹配實體上的任何字段。

回答

0

從編程的角度來看,以確保一切的最簡單的方法是在同步,當你知道事情是同步(我不建議這一點,除非你知道的東西是不同步的)是刪除所有文檔,並將它們重新放入數據存儲區中的當前內容。您可以執行列表放置文檔,就像數據存儲一樣,這會使此過程更加高效。這是保證同步的最佳方式。

如果您忘記刪除某些文檔,這可能意味着你忘了更新一些文檔以及對數據存儲的更新這就是爲什麼我建議這個...

+0

我喜歡這個解決方案最好。自從我參與這個項目已經有一段時間了,所以我忘了標記一個是正確的。但我認爲這是同步最好/最乾淨的方式 – mehulkar

0

在數據存儲區,我能夠檢索相關數據通過使用docId。 我使用像下面的代碼的東西,實現檢查所有搜索索引項和刪除不必要的那些任務:

docIndex = search.Index(name=[your_index_name]) 
docIds = [d.doc_id for d in docIndex.get_range(limit=200, ids_only=True)] 
for docId in docIds: 
    if !:# Check if docId refers to valid data 
     docIndex.delete(docId) 

如果你有更多的搜索索引200個條目,你將不得不遍歷get_range調用,將最後一個doc_id作爲start_id參數傳遞給下一個調用。