我什么时候不应该使用App Engine的全文搜索API?

时间:2012-06-08 15:40:05

标签: google-app-engine full-text-search

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

我的问题是,为什么不将我的所有数据存储在Documents中而忘记数据存储实体?与数据存储区不同,搜索API支持更丰富的query language,可以处理多个不等式过滤器和布尔运算符。

我是否遗漏了一些关于搜索API设计的内容,因为它无法完全替换数据存储区?

5 个答案:

答案 0 :(得分:7)

根据Java docs

  

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

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

更现实地说,按密钥获取实体将比数据存储更便宜(可能更快)。使用搜索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

如您所见,数据存储区获取比搜索API选项便宜得多(比Index.get()便宜16倍。)

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

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

答案 1 :(得分:5)

只需将数据放入两者中 - 存储空间很便宜,并且根据您的应用程序执行的编写程序,执行更新也可能很便宜。为了便于查询并通过密钥获取单个实体 - 使用内存缓存和数据存储。对于复杂查询,请使用搜索API。一旦宣布定价,你就必须做出权衡。

答案 2 :(得分:4)

现在每次我把它放入searchdoc中的实体索引,我也索引该实体的序列化版本。
它实际上更多更快地在搜索API上搜索文档并提取序列化字段,而不是从数据存储区获取相同数量的实体。

答案 3 :(得分:3)

不是吗:

  1. 失去了memcache的任何好处

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

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

    最后,索引的总索引大小现在为250M,而数据的上限为1 GB。数据存储区比索引的额外定价成本要大,而且尚未确定。

  3. 需要提出备份计划。我现在还不知道如果它被破坏了备份或恢复索引。将数据包含在实体中意味着可以重新创建搜索索引。您现在可以使用管理控制台备份数据存储区。

答案 4 :(得分:1)

除了查询大量数据的性能成本之外,数据存储还具有允许高度一致的数据的优势。有关强一致性与最终一致性数据的更多信息,请查看this link

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