如何将NDB搜索索引与数据存储同步

时间:2013-03-28 20:37:52

标签: google-app-engine app-engine-ndb

当我最初为我们的数据存储编写delete方法时,我搞砸了,忘了从search.Index删除实体ID。现在我发现搜索结果会带回doc_ids,但数据存储区中没有关联数据。

我想遍历所有索引文档并删除那些没有关联数据的文档。

我想我可以这样做:

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('')肯定是不正确的,因为我认为它在实体上匹配的任何字段都会多次返回同一个实体。

3 个答案:

答案 0 :(得分:0)

您可以使用Index.get_range迭代索引文档,而不是使用Index.search。更多信息:

https://developers.google.com/appengine/docs/python/search/indexclass#Index_get_range

答案 1 :(得分:0)

从编程的角度来看,确保一切都是同步的最简单方法当你知道事情不合时(除非你知道事情不同步,否则我不建议这样做)是删除所有的文档,以及将它们与当前数据存储区中的内容重新组合在一起。您可以像文件一样列出文档列表,这将使此过程更有效。这是保证同步的最佳方法。

如果您忘记删除某些文档,这可能意味着您忘记更新某些文档以及数据存储区更新,这就是我推荐的原因...

答案 2 :(得分: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参数传递给下一个调用。