Azure CosmosDB - 地理参考数据的分片策略?
Azure CosmosDB - Sharding Strategy for georeferenced data?
我在 cosmos 上收集了大约 100 万份这样的文档:
{
"title":"My Happy Bakery",
"address":"155 Happy Avenue, Happy City",
"location" : {
"coordinates" : [
-46.66357421875,
-23.6149730682373
],
"type" : "Point"
}
}
一些加分:
- 搜索模式基于点和半径,例如位置字段中的“我附近的餐馆”
- 我们说的是餐馆和市场,所以它们都集中在大都市地区......它们在很多地方都没有
- 有些城市会有很多文档(例如 70k),而其他城市则很少(例如 10)
- 邮政编码在这里被认为是有用的,因为我无法通过它进行过滤...我无法确定哪些邮政编码在 Xkm 半径圆内...
- 城市也是一个问题,因为在 BR 中,很多城市都是“连续的”,也就是说,1 公里半径搜索会找到很多位于不同 cities/counties
的文件
- 州不是一个好的选择,因为文档大量集中在 4-5 个州。根据您的位置确定您所处的状态也是一个挑战……并非不可能,但很难……
对于这种情况,好的(或理想的)分片策略是什么?这是我第一次分片这种情况所以我有点迷路...
编辑 1:
加分3、4、5、6
我最终使用距赤道的距离(以米为单位)除以 250。我使用此函数计算距离:
public static double Calculate(double lat)
{
double rad(double angle) => angle * 0.017453292519943295769236907684886127d; // = angle * Math.Pi / 180.0d
double havf(double diff) => Math.Pow(Math.Sin(rad(diff) / 2d), 2); // = sin²(diff / 2)
return 12745600 * Math.Asin(Math.Sqrt(havf(lat))); // earth radius 6.372,8km x 2 = 12745.6
}
在查询时,我们看到我们的请求时间从 2-3 秒下降到 140 毫秒。在这种分片策略之前,我们有一个地理索引很有帮助,但分片改变了一切。顺便说一句,这对我们的集合有效,其中文档大约为 1KB,分配了 400 RU
我在 cosmos 上收集了大约 100 万份这样的文档:
{
"title":"My Happy Bakery",
"address":"155 Happy Avenue, Happy City",
"location" : {
"coordinates" : [
-46.66357421875,
-23.6149730682373
],
"type" : "Point"
}
}
一些加分:
- 搜索模式基于点和半径,例如位置字段中的“我附近的餐馆”
- 我们说的是餐馆和市场,所以它们都集中在大都市地区......它们在很多地方都没有
- 有些城市会有很多文档(例如 70k),而其他城市则很少(例如 10)
- 邮政编码在这里被认为是有用的,因为我无法通过它进行过滤...我无法确定哪些邮政编码在 Xkm 半径圆内...
- 城市也是一个问题,因为在 BR 中,很多城市都是“连续的”,也就是说,1 公里半径搜索会找到很多位于不同 cities/counties 的文件
- 州不是一个好的选择,因为文档大量集中在 4-5 个州。根据您的位置确定您所处的状态也是一个挑战……并非不可能,但很难……
对于这种情况,好的(或理想的)分片策略是什么?这是我第一次分片这种情况所以我有点迷路...
编辑 1:
加分3、4、5、6
我最终使用距赤道的距离(以米为单位)除以 250。我使用此函数计算距离:
public static double Calculate(double lat)
{
double rad(double angle) => angle * 0.017453292519943295769236907684886127d; // = angle * Math.Pi / 180.0d
double havf(double diff) => Math.Pow(Math.Sin(rad(diff) / 2d), 2); // = sin²(diff / 2)
return 12745600 * Math.Asin(Math.Sqrt(havf(lat))); // earth radius 6.372,8km x 2 = 12745.6
}
在查询时,我们看到我们的请求时间从 2-3 秒下降到 140 毫秒。在这种分片策略之前,我们有一个地理索引很有帮助,但分片改变了一切。顺便说一句,这对我们的集合有效,其中文档大约为 1KB,分配了 400 RU