GAE - 搜索API - 搜索不返回新添加的文档

时间:2014-01-21 23:01:09

标签: google-app-engine google-search-api

我在我的服务器实现中使用了GAE Search API,并且遇到了一种奇怪且无法记录的行为。有时,刚刚添加到索引(Index.put())的新文档不会被直接执行的搜索(Index.search())检索。有时甚至需要一分钟左右才能使用。

它看起来像是一个最终的一致性问题,但我找不到documents中甚至提到与Search API相关的这个问题的任何内容。奇怪的是,在这段时间内这些文档不可用,我可以在管理控制台上执行完全相同的查询并获得预期的结果。

任何人都知道这里的交易是什么?这是正常行为吗?如果是这样,那么新添加的文档的最长时间是什么,直到可以搜索到它为止?为什么不记录这个?这严重影响了我应用的功能。

感谢。

2 个答案:

答案 0 :(得分:1)

根据您的其他评论,所有新添加的兴趣点必须出现在用户的地图上是合乎逻辑且绝对必要的。但是,搜索服务可能会在不可预测的时间内继续不返回新增内容。我会考虑两种策略,一种是服务器端,另一种是客户端,甚至可能同时使用两种策略。但这两件事都不简单。

在服务器上,您可以扩充搜索服务,甚至可以使用您自己开发的自定义搜索完全替换它。将要搜索的数据存储在基本为MySQL的Google Cloud SQL中。这将始终立即返回写入其中的内容,因为它是一个不受最终一致性影响的单个实例。

在客户端中,您可以缓存所有最近添加的兴趣点。然后,当从服务器请求数据时,还查询本地缓存。删除任何与服务器返回的内容重复的本地结果。其他用户最终也会看到该用户立即看到的内容。

答案 1 :(得分:0)

是的,最终的一致性(Brewer's keynote PDF)也适用于搜索。没有记录的最大收敛时间可能意味着实施一个平衡会产生适得其反的效果。如果没有时间保证,GAE甚至可能在未来发展并表现不同。我听说有些GAE用户迁移到Riak以调整其CAP参数以满足特定的应用程序时序要求。

在不同时间出现在不同子系统中的最新写入的症状表明分布式缓存。您最好的策略是重新设计您的功能,以减少对时间的依赖。大多数可扩展的应用程序都是这样做的。