20

到目前为止,我已经使用 App Engine 的全文搜索来帮助搜索数据存储区中的现有实体。这涉及为每个实体创建至少一个Document,并以某种方式将两者联系在一起。而且每次更改实体时,都必须更改对应的Documents.

我的问题是,为什么不把我的所有数据都存储进去Documents,然后忘记 Datastore 实体呢?与数据存储区不同,搜索 API 支持更丰富的查询语言,可以处理多个不等式过滤器和布尔运算符。

我是否遗漏了有关搜索 API 设计的某些内容,这些内容会妨碍使用它来完全替换数据存储区?

4

5 回答 5

7

根据Java文档

但是,索引搜索最多只能找到 10,000 个匹配文档。App Engine 数据存储区可能更适合需要检索非常大的结果集的应用程序。

虽然我不认为这是一个常见的用例。

更现实的是,使用 Datastore 按键获取实体会便宜很多(大概也更快)。使用搜索 API,您可以使用 Index.get() 按 ID 查找文档,或者通过将 ID 存储在字段中并在该字段上搜索来复制 ID。

以下是费用明细:

- Index.get():     $0.10 /  10,000 or 0.00001 per get
- Index.search():  $0.13 /  10,000 or 0.000013 per get
- Datastore get(): $0.06 / 100,000 or 0.0000006 per get

如您所见,Datastore get 比 Search API 选项便宜得多(比 Index.get() 便宜 16 倍)。

如果您的数据结构使用大量直接获取和少量复杂搜索,那么数据存储区在成本方面将是明显的赢家。

注意:我没有包括使用 Index.search() 方法存储重复数据的额外成本,因为这取决于您存储的实体数量。

于 2013-08-20T17:37:23.027 回答
5

只需将数据放在两者中 - 存储很便宜,并且取决于您的应用程序执行多少写入操作,进行更新也可能很便宜。为了方便查询和按键获取单个实体 - 使用 memcache 和数据存储。对于复杂查询,请使用搜索 API。一旦宣布定价,您就必须做出权衡。

于 2012-10-18T17:48:27.157 回答
4

现在每次我在searchdoc中索引一个实体,我也索引实体的序列化版本。
实际上,它通过搜索 api 搜索文档并提取序列化字段比从数据存储中获取相同数量的实体要快得多

于 2012-10-18T18:47:11.987 回答
3

你不会:

  1. 失去 memcache 的任何好处

  2. 面临较低的配额。“我们预计,一旦该功能从实验阶段毕业,我们的免费配额将涵盖每天约 1,000 次搜索”我看不到您获得的读取次数,但我相信数据存储的读取次数更高。我查看了https://developers.google.com/appengine/docs/quotas#Resources

    此外,对于实体更新,我们通过更新或新看跌期权收取不同的费用。似乎索引没有更新,而是作为新文档添加(这就是我正在做的事情)。没有指数定价的细节,很难确切知道,但更新一个实体上的一两个索引值可能比放置一个新的整个指数更便宜。我猜这取决于你的数据。

    最后,索引的总索引大小现在为 250M,而数据上限为 1 GB。那时的数据存储更大,还没有关于索引额外定价成本的消息。

  3. 需要制定一个备用计划。如果索引损坏,我现在不知道备份或恢复索引。拥有实体中的数据意味着可以重新创建搜索索引。您现在可以使用管理控制台备份数据存储。

于 2012-06-08T22:13:45.997 回答
1

除了查询大型数据集的性能成本外,数据存储还具有允许数据高度一致的优势。查看此链接以获取有关强一致数据与最终一致数据的更多信息。

应该假设存储在 Search API 索引中的文档最终是一致的。

于 2016-11-26T20:58:07.070 回答