我要查询的是一个Azure Cosmos DB集合,希望使用地理空间索引进行有效查询。我遇到的问题是RU消耗效率低下。
该集合中只有5万个1kb文档,但是使用ST_DISTANCE返回单个文档的查询将消耗900 RU。
我已经看到RUs基于集合中文档的数量线性增加。索引似乎可以防止这种情况。
示例查询(950 RU):
SELECT * FROM c where ST_DISTANCE(c.location, { 'type': 'Point', 'coordinates': [34.69, -1.91] }) < 500
示例文档:
[
{
"id": "1504891036",
"name": "Oujda",
"location": {
"type": "Point",
"coordinates": [
34.69,
-1.91
]
},
"population": 409391,
"country": "Morocco",
"country.iso2": "MA",
"country.iso3": "MAR",
}
]
我尚未修改默认的索引策略,该策略似乎涵盖了空间索引:
{
"indexingMode": "consistent",
"automatic": true,
"includedPaths": [
{
"path": "/*",
"indexes": [
{
"kind": "Range",
"dataType": "Number",
"precision": -1
},
{
"kind": "Range",
"dataType": "String",
"precision": -1
},
{
"kind": "Spatial",
"dataType": "Point"
}
]
}
],
"excludedPaths": []
}
答案 0 :(得分:0)
我确定了问题。我已经调换了GeoJSON指定的经度和纬度坐标:
Cosmos预期:
"location": {
"type": "Point",
"coordinates": [
<@lon>,
<@lat>
]
我错误地认为这是经/纬度。因此,我的许多纬度超出了所需的90 / -90范围,因为经度可以为180 / -180。重新创建约5万份文档后,用于基于坐标的查找的RU始终为<10 RU。
在修复之前(所有文档都已调换经/纬度坐标,许多超出了90 / -90范围,因此无效):
SELECT * FROM c where ST_DISTANCE(c.location, { 'type': 'Point', 'coordinates': [34.69, -1.91] }) < 500
940 RUs, 1 document returned
修复后(根据GeoJSON规范正确设置了经纬度的所有文档)
SELECT * FROM c where ST_DISTANCE(c.location, { 'type': 'Point', 'coordinates': [-1.91,34.69] }) < 500
6 RUs, 1 document returned
最初的问题已通过以下查询确认/诊断:
SELECT ST_ISVALIDDETAILED(c.location) FROM c where c.name = "Kansas City"
Error: "Latitude values must be between -90 and 90 degrees."