如何有效删除Google App engine Search API索引

How to effectively delete Google App engine Search API index

我在这里发现了一些类似的问题,但没有可靠的答案。

我看到一些谷歌用户建议

You can effectively delete an index by first using index.delete() to remove all of the documents from an index, and then using index.delete_schema() to remove the type mappings from the index 1.

可惜golang sdk没有"index.delete_schema()"api。 我只能通过从索引中获取 itemId 列表来一个一个地删除文档。我们在仪表板中得到了一个令人惊讶的账单状态:

Resource                       Usage           Billable         Price              Cost
Search API Simple Searches  214,748.49 10K Ops  214,748.39  [=12=].625 / 10K Ops    4,217.74 

有人能告诉我如何有效地删除 Google App 引擎搜索 API 索引而不需要那么多钱吗?

正如您所说,删除索引目前是only available for Java 8

由于您使用的是 GO,目前无法删除索引,但您可以删除索引中的文档以减少 cost

要从索引中删除文档,您可以按照此示例进行操作here

func deleteHandler(w http.ResponseWriter, r *http.Request) {
        ctx := appengine.NewContext(r)

        index, err := search.Open("users")
        if err != nil {
                http.Error(w, err.Error(), http.StatusInternalServerError)
                return
        }

        id := "PA6-5000"
        err = index.Delete(ctx, id)
        if err != nil {
                http.Error(w, err.Error(), http.StatusInternalServerError)
                return
        }
        fmt.Fprint(w, "Deleted document: ", id)
}

不幸的是,除了删除整个应用程序(实际上,在某些情况下这可能是一种有效的方法)之外,没有任何简单的操作可以让您删除整个大型搜索索引而不会产生大量成本。

简短的回答是否定的。

GCP 没有一种非常有效的方法可以一次性删除完整的搜索索引。 他们自己在 "Best Practices" 中建议的唯一有效方法是每次 index.delete() 方法调用(在 Java 和 Python app engine sdk 中)批量删除 200 个文档。

更令人失望的是,GO SDK 甚至不支持这个,每次调用只允许删除一个文档。 GCP的支持太惨了!

因此,如果您的索引已增长到一些不错的 GB,您将被迫花费金钱和时间,或者更好的说法是自费清理 GCP 留下的烂摊子。请注意,巨型索引>10GB 会花费您很多。

现在,如何在 GO 运行时执行。

不要使用 GO 运行时

更好的是,在同一 projectId 下的 Java 或 Python 中编写一个 micro-service,并将这些运行时与它们的 SDKs/Client 库一起使用,以删除索引,这是唯一有效的方法(每次通话 200 次),GCP 提供。因此,使用 App Engine 的解决方案非常有限且本质上是成本承担解决方案。必须忍受它,亲爱的 :)

PS. 一年前,我就此创建了一个 bug/issue。尚未采取任何行动 :)