0

当我最初为我们的数据存储编写delete方法时,我搞砸了,忘记从search.Index. 现在我发现搜索结果已恢复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('')也绝对不正确,因为我认为它在实体上匹配的任何字段都会多次返回同一个实体。

4

3 回答 3

0

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

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

于 2013-03-28T23:02:55.787 回答
0

从编程的角度来看,当您知道事情不同步时,确保一切同步的最简单方法(除非您知道事情不同步,否则我不建议这样做)是删除所有文档,然后重新放置它们与数据存储中当前的内容。您可以对文档执行 list puts,就像数据存储一样,这将使此过程更加高效。这是保证同步的最佳方式。

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

于 2013-03-29T14:27:41.240 回答
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 参数传递给下一个调用。

于 2013-07-05T05:59:34.017 回答