在使用google app engine search API时,如果我们有一个返回大型结果集(>1000)的查询,并且需要使用游标迭代来收集整个结果集,那么如果number_found_accuracy小于我们的结果大小,我们就会得到返回文档的不确定结果。
换句话说,同一个查询运行两次,通过游标收集所有文档,不会返回相同的文档,除非我们的number_found_accuracy大于结果大小(例如,使用最大值10000 )。只有这样,我们才能得到相同的文档。
我们对number_found_accuracy如何工作的理解是,它只会影响number_found估计。我们假设,如果您使用游标来获取所有结果,那么您将能够获得与运行一个大型查询相同的结果。
我们是误解了number_found_accuracy或游标的用法,还是发现了一个bug?
发布于 2014-04-11 03:27:19
您对number_found_accuracy的理解是正确的。我认为您正在观察的行为是复制查询故障转移和指定number_found_accuracy的查询如何使用连续标记影响未来查询之间令人惊讶的相互作用。
当您使用搜索应用编程接口为文档建立索引时,我们使用与高复制数据存储相同的机制(即Megastore)将它们存储在几个不同的副本中。这些文档在每个副本上存活的速度取决于许多因素。它通常是即时的,但如果您正在对单个(索引、名称空间)对进行批量写入,延迟可能会变得更长。
搜索可以在这些副本中的任何一个上执行。我们甚至可能会在与原始搜索不同的副本上运行使用延续令牌的搜索。如果原始副本和/或延续副本正在赶上它们的索引工作,则它们可能具有不同的活动文档集。它最终会变得始终如一,但并不总是立马就能实现。
如果在查询上指定number_found_accuracy,我们必须运行大部分查询,就好像我们要返回number_found_accuracy结果一样。我们特别需要进一步阅读帖子列表,以查找和统计匹配的文档。读取张贴列表会导致将其关联的文件块插入到各种缓存中。
反过来,当您使用光标进行搜索时,我们将能够在用于原始搜索的相同副本上更快地读取真正的文档。因此,不太可能将继续搜索故障转移到另一个副本,该副本可能尚未完成对同一组文档的索引。我认为您观察到的不一致结果是这种延续查询故障转移的结果。
总之,将number_found_accuracy设置为较大值可以有效地预热副本的缓存。因此,对于继续搜索,它几乎肯定是最快的副本。面对试图赶上索引的副本,这将给出number_found_accuracy对结果一致性有直接影响的表面效果,但实际上它只是一个副作用。
https://stackoverflow.com/questions/15180888
复制相似问题