想象一下,用户搜索系统从用户自己的位置提供邻近搜索,该位置由小数纬度/经度组合指定。例如,亚特兰大居民的位置将由33.756944,-84.390278
表示,该用户的外围搜索应该在半径10英里,50英里等范围内产生他所在区域的其他用户。
表值函数计算距离并相应地提供用户,按照开始搜索的用户的上升距离排序。它总是一个实时查询,而且是一个艰难而频繁的查询。现在,我们想要构建某种缓存以减少负载。
到目前为止,所有用户都按其纬度/经度的整数部分进行了分组。我们的想法是从网格方块创建包含所有用户的缓存文件,因此访问相关的缓存文件很容易。如果网格方块包含的用户数多于缓存文件应该包含的数量,则将方块四分之一或进一步分为八个部分,依此类推。为了充分利用正方形及其高速缓存文件,可以考虑多个重叠的正方形。这种方法的一个不足之处在于,将高密度大都市区域和广泛的乡村网格划分为高速缓存文件可能不是最佳的。
继续阅读,我偶然发现了诸如最近邻搜索,曼哈顿距离和树状空间分区技术之类的主题,如k-d树,四叉树或二进制空间分区。此外,SQL Server提供了自己的地理数据类型和函数(虽然我猜测纯数学FLOAT
方式具有足够的性能)。当然,关键是使以用户为中心的邻近搜索可以缓存。
我没有找到太多资源,但我确信我不是第一个有这个计划的人。请记住,这不是关于搜索,而是关于缓存。
答案 0 :(得分:1)
我可以废弃我的方法吗?
您可以调整您的appoach,因为正如您已经注意到的,四叉树使用此技术。或者您使用地理空间扩展。这也适用于MySql。
是否存在将用户有利地划分为多种方式的方法 同等规模的地理区划
当位置均匀分布或区域非常小时,相同大小的简单固定网格就可以了。地理位置几乎不等分布。通常使用地理空间结构。看下一个答案:
是否存在存储空间用户信息的最佳实践 有效的邻近搜索 四叉树,k-d树或R树。
您如何看待上述技术(四叉树等)以及如何将它们与缓存配对?
来自Hannan Samet的一些作品描述了四叉树和缓存。