空间索引不适用于ST_DISTANCE查询和'<'

时间:2019-05-01 22:24:26

标签: azure-cosmosdb

空间索引似乎不适用于包含带有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

它将按原样返回文档,但是并没有利用我将需要的索引,因为我将存储很多坐标。

这似乎是引用here的相同问题。如果我在较远的地方添加第二个文档,并在第一个查询中将“ <”更改为“>”,那么它将起作用!

我应该提到这仅在Azure上发生。当我使用Azure Cosmos Db模拟器时,它可以完美运行!这里发生了什么?!任何提示或建议都将不胜感激。

更新:我发现了查询在仿真器而不是Azure上运行的原因-仿真器上的数据库未在其集合之间预配置(共享)吞吐量, Azure中的数据库具有预配置的吞吐量以降低成本(即4个集合共享400 RU / s)。我在Azure中创建了一个未配置的吞吐量数据库,该查询可与空间索引一起使用!!我将用Microsoft记录此问题,以查看是否存在这种情况?

1 个答案:

答案 0 :(得分:0)

感谢您跟进有关固定集合的更多详细信息,但是我确实想获得一些其他信息。

Cosmos DB仿真器现在支持容器:

  

默认情况下,您可以使用Azure Cosmos模拟器最多创建25个固定大小的容器(仅使用Azure Cosmos DB SDK支持)或5个无限制的容器。通过修改PartitionCount值,您最多可以创建250个固定大小的容器或50个无限制的容器,或者两个不超过250个固定大小的容器的任意组合(其中一个无限制的容器= 5个固定大小的容器)。但是,不建议将仿真器设置为与200个固定大小的容器一起运行。由于它增加了磁盘IO操作的开销,因此在使用端点API时会导致无法预测的超时。

所以,我想看看您使用的是哪个版本的仿真器。当前版本是azure-cosmosdb-emulator-2.2.2。