有关在Azure存储中存储和搜索地理位置数据的问题

时间:2011-11-08 19:21:02

标签: azure geolocation

嘿大家我正在建立一个网站,需要能够存储一个人的物理位置,并允许某人在该位置的某个半径范围内搜索其他人。为了举个例子,我们假装它是一个约会网站(它不是),所以作为一个用户,你想要找到距你当前位置50英里的人,以满足其他一些搜索标准。

目前,我将所有用户信息存储在Azure Table Storage中。然而,这是我第一次尝试创建地理感知搜索算法,所以我想验证我不会浪费时间做一些完全疯狂的事情。为此,我的实施想法如下:

  1. 在Azure表中存储用户位置的经度和纬度
  2. 每个条目的PartitionKey是该人所居住的州(或美国境外的国家/地区)
  3. 我想使用半正方程计算当前用户与所有其他用户之间的距离。我假设我可以将其嵌入到我的LINQ查询中?
  4. 最后,我希望能够获得半径内所有州/国家的列表,以便我可以根据PartitionKey的优化进行优化
  5. 这种实施策略自然会引出一些问题:

    1. 如果我在LINQ查询中执行hasrsine等式,它在哪里被执行?我想要的最后一件事就是我的WebRole从azure存储中提取每条记录,在应用程序进程中运行这个半正方程式
    2. 使用Azure存储这样做的想法是否完全疯了?我知道像MongoDB这样的解决方案能够内置空间搜索查询。我喜欢Azure的可扩展性,但是我应该调查一些更好的替代方案吗?
    3. 提前感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

如果希望查询对Azure表快速,则必须针对分区键和行键运行查询。此外,如果您使用LINQ查询Azure表,则需要注意您使用的功能。如果可以为所有行计算一次值,LINQ将是聪明的并在将查询发送到AZT之前对其进行评估,但是如果需要针对每一行评估它,那么您只能使用那些Azure支持的那些(这是一个很短的名单)。

如果您想使用区域的边界方块而不是边界圆,则可以使此工作正常。将纬度存储在PartitionKey中的RowKey和经度中,并使用如下所示的查询:

var query = from UserLocation ul
            in repository.All()
        where
            ul.PartitionKey.CompareTo(minimumLatitude) > 0
            && ul.PartitionKey.CompareTo(maximumLatitude) < 0
            && ul.RowKey.CompareTo(minimumLongitude) > 0
            && ul.RowKey.CompareTo(maximumLongitude) < 0
        select
            ul;

这可能不像你希望的那样聪明。如果这对您不起作用,那么您需要查看其他选项。如果您希望保留在Microsoft系列中,SQL Azure支持geospatial queries

答案 1 :(得分:0)

在SQL Azure中使用空间查询(大约500万条记录)后,我可以确认它非常快 - 可能值得一看。