azure-cosmosdb - 空间索引不适用于 ST_DISTANCE 查询和“<”
问题描述
空间索引似乎不适用于包含具有 GeoJson 坐标的文档的集合。我已经尝试使用默认索引策略,它固有地为所有字段提供空间索引。
我尝试从头开始创建一个新的 Cosmos Db 帐户、数据库和集合,但没有成功让空间索引与 ST_DISTANCE 查询一起使用。
我已经使用以下索引策略设置了一个简单的集合:
{
"indexingMode": "consistent",
"automatic": true,
"includedPaths": [
{
"path": "/\"location\"/?",
"indexes": [
{
"kind": "Spatial",
"dataType": "Point"
},
{
"kind": "Range",
"dataType": "Number",
"precision": -1
},
{
"kind": "Range",
"dataType": "String",
"precision": -1
}
]
}
],
"excludedPaths": [
{
"path": "/*",
},
{
"path": "/\"_etag\"/?"
}
]
}
我插入到集合中的文档:
{
"id": "document1",
"type": "Type1",
"location": {
"type": "Point",
"coordinates": [
-50,
50
]
},
"name": "TestObject"
}
应该返回集合中单个文档的查询:
SELECT * FROM f WHERE f.type = "Type1" and ST_DISTANCE(f.location, {'type': 'Point', 'coordinates':[-50,50]}) < 200000
没有返回任何结果。如果我在不使用空间索引的情况下显式查询,如下所示:
SELECT * FROM f WHERE f.type = "Type1" and ST_DISTANCE({'type': 'Point', 'coordinates':[f.location.coordinates[0],f.location.coordinates[1]]}, {'type': 'Point', 'coordinates':[-50,50]}) < 200000
它按应有的方式返回文档,但没有利用我需要的索引,因为我将存储大量坐标。
这似乎与此处引用的问题相同。如果我在远处添加第二个文档并在第一个查询中将“<”更改为“>”,它就可以工作!
我应该提到这仅发生在 Azure 上。当我使用 Azure Cosmos Db Emulator 时,它可以完美运行!这里发生了什么?!非常感谢任何提示或建议。
更新:我发现了查询在模拟器而不是 Azure 上工作的原因 - 模拟器上的数据库在其集合之间没有预置(共享)吞吐量,而我在 Azure 中使用预置吞吐量来制作数据库以降低成本(即 4 个集合共享 400 RU/s)。我在 Azure 中创建了一个非预配吞吐量数据库,并且该查询与空间索引一起使用!!我将与 Microsoft 记录此问题,看看是否有原因导致这种情况?
解决方案
感谢您跟进有关作为解决方案的固定集合的其他详细信息,但我确实想获得一些其他信息。
Cosmos DB 模拟器现在支持容器:
默认情况下,您最多可以创建 25 个固定大小的容器(仅支持使用 Azure Cosmos DB SDK),或使用 Azure Cosmos 模拟器创建 5 个无限容器。通过修改 PartitionCount 值,您可以创建最多 250 个固定大小的容器或 50 个无限制的容器,或者不超过 250 个固定大小的容器(其中 1 个无限制的容器 = 5 个固定大小的容器)的任意组合。但是,不建议将模拟器设置为运行超过 200 个固定大小的容器。由于它增加了磁盘 IO 操作的开销,这会导致在使用端点 API 时出现不可预知的超时。
所以,我想看看你使用的是哪个版本的模拟器。当前版本是 azure-cosmosdb-emulator-2.2.2。
推荐阅读
- timer - 如何在没有背景颜色的情况下通过进度条 GUI 制作 Autohotkey 单击
- c# - 使用教程使用 C# 和 DirectX 从操纵杆获取输入
- git - 如何将我现有的 repo 推送到另一个 repo 的分支?
- html - 未显示 SVG 路径
- node.js - $geoNear MongoDB 的替代品
- reactjs - 最初如何根据 id 滚动到特定位置?
- python - 当列不是严格列表时如何在 Pandas 中扩展列表数据
- r - Ubuntu 18.4 安装 R 语言 3.5
- swift - 为什么 SwiftUI 中的 Class 比 Struct 快?(举例)
- python-3.x - 如何将新路径附加到 python?