1

我正在研究使用类似 geohash 的索引存储地理空间信息,也许使用希尔伯特曲线。我的问题是关于如何最好地拆分此类索引上的区域查询。

例如,本文展示了如何将一个区域查询拆分为多个查询,以避免查询表现出较差局部性的范围(参见图)。如果您想使用 Z 曲线(如普通 geohash)通过单个查询来搜索圆形区域,您将不得不查询整个左下象限,它只有我们关注的区域的一小部分。

在这种情况下,最好将搜索拆分为几个查询,但是我无法找到有关如何最好地执行此操作的任何信息。是否有将这样的范围查询拆分为覆盖原始区域的较小范围的算法?

4

1 回答 1

0

一旦您确定了一个覆盖查询范围的哈希前缀,您就可以开始将该前缀拆分为组成前缀,并在保留之前测试每个前缀是否与您的查询范围相交。例如,假设您已将前缀 0100 标识为覆盖您的查询区域。前缀 0100 包括前缀 01000 和 01001,而前缀 01000 包括前缀 010000 和 010001,前缀 01001 包括前缀 010010 和 010011 等。当您将前缀重写为更大前缀的集合时(对应于较小的区域),您可以过滤掉那些不与查询范围相交的前缀。您必须在某个时候停止拆分过程;每次拆分迭代都可能使前缀集合的大小翻倍。例如,您可以创建 最大前缀集合大小,此时您声明对过滤感到满意;当然,您可以使用其他指标来找到停止点。作为最后一步,您可以重新组合“相邻”前缀,以减少您正在执行的搜索次数。例如,如果您留下前缀 01000 和 01001,您可以将它们组合到 0100 中以避免搜索 01000,然后搜索 01001(假设搜索过程具有超出顺序读取的开销,这是一个好处) . 您需要一个计算哈希前缀边界框的例程,以便测试与查询边界的交集。这将取决于您使用的散列方案。您可以使用其他指标来找到停止点。作为最后一步,您可以重新组合“相邻”前缀,以减少您正在执行的搜索次数。例如,如果您留下前缀 01000 和 01001,您可以将它们组合到 0100 中以避免搜索 01000,然后搜索 01001(假设搜索过程具有超出顺序读取的开销,这是一个好处) . 您需要一个计算哈希前缀边界框的例程,以便测试与查询边界的交集。这将取决于您使用的散列方案。您可以使用其他指标来找到停止点。作为最后一步,您可以重新组合“相邻”前缀,以减少您正在执行的搜索次数。例如,如果您留下前缀 01000 和 01001,您可以将它们组合到 0100 中以避免搜索 01000,然后搜索 01001(假设搜索过程具有超出顺序读取的开销,这是一个好处) . 您需要一个计算哈希前缀边界框的例程,以便测试与查询边界的交集。这将取决于您使用的散列方案。您只剩下前缀 01000 和 01001,您可以将它们组合成 0100 以避免先搜索 01000,然后再搜索 01001(假设搜索过程具有超出顺序读取的开销,这是一个好处)。您需要一个计算哈希前缀边界框的例程,以便测试与查询边界的交集。这将取决于您使用的散列方案。您只剩下前缀 01000 和 01001,您可以将它们组合成 0100 以避免先搜索 01000,然后再搜索 01001(假设搜索过程具有超出顺序读取的开销,这是一个好处)。您需要一个计算哈希前缀边界框的例程,以便测试与查询边界的交集。这将取决于您使用的散列方案。

于 2013-08-24T01:13:05.120 回答