Indexing 如何在CosmosDB中索引和查询复杂的空间类型?

Indexing 如何在CosmosDB中索引和查询复杂的空间类型?,indexing,azure-cosmosdb,geospatial,azure-cosmosdb-sqlapi,spatial-index,Indexing,Azure Cosmosdb,Geospatial,Azure Cosmosdb Sqlapi,Spatial Index,我有一个CosmosDB数据库/集合,其分区键位于/id上,并使用地理配置启用了空间索引。当我在给定的LineString或Polygon中查询具有LineString属性的对象时,查询将检索集合中的所有文档,然后返回LineString/Polygon中的文档(检索的大于输出)。RU的消耗量随着集合中项目数量的增加而增加,这向我表明它基本上在进行扫描,索引不起作用 声明如下: Azure Cosmos DB支持对点、线串、多边形和多多边形进行索引 但是,文档中没有不使用点类型的示例,我无法使用

我有一个CosmosDB数据库/集合,其分区键位于
/id
上,并使用地理配置启用了空间索引。当我在给定的
LineString
Polygon
中查询具有
LineString
属性的对象时,查询将检索集合中的所有文档,然后返回
LineString
/
Polygon
中的文档(检索的大于输出)。RU的消耗量随着集合中项目数量的增加而增加,这向我表明它基本上在进行扫描,索引不起作用

声明如下:

Azure Cosmos DB支持对点、线串、多边形和多多边形进行索引

但是,文档中没有不使用
类型的示例,我无法使用排他性非
类型的排列进行查询并点击索引

为了测试空间索引是否正常工作,我在项目上有一个附加的
Start
属性,该属性的值为
LineString
中的第一个
,我可以在恒定RU消耗下查询该属性是否在
多边形

以下是索引:

{
    "indexingMode": "consistent",
    "automatic": true,
    "includedPaths": [
        {
            "path": "/*"
        }
    ],
    "excludedPaths": [
        {
            "path": "/\"_etag\"/?"
        }
    ],
    "spatialIndexes": [
        {
            "path": "/*",
            "types": [
                "Point",
                "LineString",
                "Polygon",
                "MultiPolygon"
            ]
        }
    ]
}
这是针。干草堆大约有1000个对象,带有随机的
线串

{
    "id": "test",
    "Start": {
        "type": "Point",
        "coordinates": [ 1, 3 ]
    },
    "Points": {
        "type": "LineString",
        "coordinates": [ [ 1, 3 ], [ 1, 4 ], [ 1, 5 ] ]
    }
}
以下是
多边形中的搜索:

SELECT *
FROM items i
WHERE ST_WITHIN(i.Points, {
    "type":"Polygon",
    "coordinates": [[[0, 10], [0, 0], [2, 0], [2, 10], [0, 10]]]
})
---
Request Charge:           127.4 RUs
Retrieved document count: 992
Retrieved document size:  1219980 bytes
Output document count:    1
Output document size:     441 bytes
Index hit document count: 0
Index lookup time:        3.77 ms
以下是
行字符串中的搜索:

SELECT *
FROM items i
WHERE ST_WITHIN(i.Points, {
    "type":"LineString",
    "coordinates": [[1, 3], [1, 4], [1, 5]]
})
---
Request Charge:           122.53 RUs
Retrieved document count: 992
Retrieved document size:  1219980 bytes
Output document count:    1
Output document size:     441 bytes
Index hit document count: 0
Index lookup time:        3.0100000000000002 ms
以下是在与上述相同的
多边形中搜索
开始
,显示空间索引已启用并工作:

SELECT *
FROM items i
WHERE ST_WITHIN(i.Start, {
    "type":"Polygon",
    "coordinates": [[[0, 10], [0, 0], [2, 0], [2, 10], [0, 10]]]
---
Request Charge:           8.1 RUs
Retrieved document count: 1
Retrieved document size:  343 bytes
Output document count:    1
Output document size:     392 bytes
Index hit document count: 1
Index lookup time:        2.79 ms

我创建了一个容器并添加了您的示例文档,但结果与您的不同

第一个sql结果:

SELECT *
FROM items i
WHERE ST_WITHIN(i.Points, {
    "type":"Polygon",
    "coordinates": [[[0, 10], [0, 0], [2, 0], [2, 10], [0, 10]]]
})
---
Request Charge:            10.53 RUs
Retrieved document count:  1
Retrieved document size:   349 bytes
Output document count:     1
Output document size:      398 bytes
Index hit document count:  1
Index lookup time:         1.6800000000000002 ms
SELECT *
FROM items i
WHERE ST_WITHIN(i.Points, {
    "type":"LineString",
    "coordinates": [[1, 3], [1, 4], [1, 5]]
})
---
Request Charge:            7.24 RUs
Retrieved document count:  1
Retrieved document size:   349 bytes
Output document count:     1
Output document size:      398 bytes
Index hit document count:  1
Index lookup time:         1.1399000000000001 ms
SELECT *
FROM items i
WHERE ST_WITHIN(i.Start, {
    "type":"Polygon",
    "coordinates": [[[0, 10], [0, 0], [2, 0], [2, 10], [0, 10]]]
})
---
Request Charge:            10.53 RUs
Retrieved document count:  1
Retrieved document size:   349 bytes
Output document count:     1
Output document size:      398 bytes
Index hit document count:  1
Index lookup time:         1.6500000000000001 ms
第二个sql结果:

SELECT *
FROM items i
WHERE ST_WITHIN(i.Points, {
    "type":"Polygon",
    "coordinates": [[[0, 10], [0, 0], [2, 0], [2, 10], [0, 10]]]
})
---
Request Charge:            10.53 RUs
Retrieved document count:  1
Retrieved document size:   349 bytes
Output document count:     1
Output document size:      398 bytes
Index hit document count:  1
Index lookup time:         1.6800000000000002 ms
SELECT *
FROM items i
WHERE ST_WITHIN(i.Points, {
    "type":"LineString",
    "coordinates": [[1, 3], [1, 4], [1, 5]]
})
---
Request Charge:            7.24 RUs
Retrieved document count:  1
Retrieved document size:   349 bytes
Output document count:     1
Output document size:      398 bytes
Index hit document count:  1
Index lookup time:         1.1399000000000001 ms
SELECT *
FROM items i
WHERE ST_WITHIN(i.Start, {
    "type":"Polygon",
    "coordinates": [[[0, 10], [0, 0], [2, 0], [2, 10], [0, 10]]]
})
---
Request Charge:            10.53 RUs
Retrieved document count:  1
Retrieved document size:   349 bytes
Output document count:     1
Output document size:      398 bytes
Index hit document count:  1
Index lookup time:         1.6500000000000001 ms
第三个sql结果:

SELECT *
FROM items i
WHERE ST_WITHIN(i.Points, {
    "type":"Polygon",
    "coordinates": [[[0, 10], [0, 0], [2, 0], [2, 10], [0, 10]]]
})
---
Request Charge:            10.53 RUs
Retrieved document count:  1
Retrieved document size:   349 bytes
Output document count:     1
Output document size:      398 bytes
Index hit document count:  1
Index lookup time:         1.6800000000000002 ms
SELECT *
FROM items i
WHERE ST_WITHIN(i.Points, {
    "type":"LineString",
    "coordinates": [[1, 3], [1, 4], [1, 5]]
})
---
Request Charge:            7.24 RUs
Retrieved document count:  1
Retrieved document size:   349 bytes
Output document count:     1
Output document size:      398 bytes
Index hit document count:  1
Index lookup time:         1.1399000000000001 ms
SELECT *
FROM items i
WHERE ST_WITHIN(i.Start, {
    "type":"Polygon",
    "coordinates": [[[0, 10], [0, 0], [2, 0], [2, 10], [0, 10]]]
})
---
Request Charge:            10.53 RUs
Retrieved document count:  1
Retrieved document size:   349 bytes
Output document count:     1
Output document size:      398 bytes
Index hit document count:  1
Index lookup time:         1.6500000000000001 ms
根据我的测试,每个sql都会命中索引


顺便说一句,我的索引与您相同,地理空间配置为
Geography
。您可以再试一次,如果结果与上面的类似,请让我知道更多详细信息,例如sdk或您文档的详细信息(我在Azure portal上对此进行了测试)。

我创建了一个容器并添加了您的示例文档,但结果与你的不同

第一个sql结果:

SELECT *
FROM items i
WHERE ST_WITHIN(i.Points, {
    "type":"Polygon",
    "coordinates": [[[0, 10], [0, 0], [2, 0], [2, 10], [0, 10]]]
})
---
Request Charge:            10.53 RUs
Retrieved document count:  1
Retrieved document size:   349 bytes
Output document count:     1
Output document size:      398 bytes
Index hit document count:  1
Index lookup time:         1.6800000000000002 ms
SELECT *
FROM items i
WHERE ST_WITHIN(i.Points, {
    "type":"LineString",
    "coordinates": [[1, 3], [1, 4], [1, 5]]
})
---
Request Charge:            7.24 RUs
Retrieved document count:  1
Retrieved document size:   349 bytes
Output document count:     1
Output document size:      398 bytes
Index hit document count:  1
Index lookup time:         1.1399000000000001 ms
SELECT *
FROM items i
WHERE ST_WITHIN(i.Start, {
    "type":"Polygon",
    "coordinates": [[[0, 10], [0, 0], [2, 0], [2, 10], [0, 10]]]
})
---
Request Charge:            10.53 RUs
Retrieved document count:  1
Retrieved document size:   349 bytes
Output document count:     1
Output document size:      398 bytes
Index hit document count:  1
Index lookup time:         1.6500000000000001 ms
第二个sql结果:

SELECT *
FROM items i
WHERE ST_WITHIN(i.Points, {
    "type":"Polygon",
    "coordinates": [[[0, 10], [0, 0], [2, 0], [2, 10], [0, 10]]]
})
---
Request Charge:            10.53 RUs
Retrieved document count:  1
Retrieved document size:   349 bytes
Output document count:     1
Output document size:      398 bytes
Index hit document count:  1
Index lookup time:         1.6800000000000002 ms
SELECT *
FROM items i
WHERE ST_WITHIN(i.Points, {
    "type":"LineString",
    "coordinates": [[1, 3], [1, 4], [1, 5]]
})
---
Request Charge:            7.24 RUs
Retrieved document count:  1
Retrieved document size:   349 bytes
Output document count:     1
Output document size:      398 bytes
Index hit document count:  1
Index lookup time:         1.1399000000000001 ms
SELECT *
FROM items i
WHERE ST_WITHIN(i.Start, {
    "type":"Polygon",
    "coordinates": [[[0, 10], [0, 0], [2, 0], [2, 10], [0, 10]]]
})
---
Request Charge:            10.53 RUs
Retrieved document count:  1
Retrieved document size:   349 bytes
Output document count:     1
Output document size:      398 bytes
Index hit document count:  1
Index lookup time:         1.6500000000000001 ms
第三个sql结果:

SELECT *
FROM items i
WHERE ST_WITHIN(i.Points, {
    "type":"Polygon",
    "coordinates": [[[0, 10], [0, 0], [2, 0], [2, 10], [0, 10]]]
})
---
Request Charge:            10.53 RUs
Retrieved document count:  1
Retrieved document size:   349 bytes
Output document count:     1
Output document size:      398 bytes
Index hit document count:  1
Index lookup time:         1.6800000000000002 ms
SELECT *
FROM items i
WHERE ST_WITHIN(i.Points, {
    "type":"LineString",
    "coordinates": [[1, 3], [1, 4], [1, 5]]
})
---
Request Charge:            7.24 RUs
Retrieved document count:  1
Retrieved document size:   349 bytes
Output document count:     1
Output document size:      398 bytes
Index hit document count:  1
Index lookup time:         1.1399000000000001 ms
SELECT *
FROM items i
WHERE ST_WITHIN(i.Start, {
    "type":"Polygon",
    "coordinates": [[[0, 10], [0, 0], [2, 0], [2, 10], [0, 10]]]
})
---
Request Charge:            10.53 RUs
Retrieved document count:  1
Retrieved document size:   349 bytes
Output document count:     1
Output document size:      398 bytes
Index hit document count:  1
Index lookup time:         1.6500000000000001 ms
根据我的测试,每个sql都会命中索引


顺便说一句,我的索引与您相同,地理空间配置为
Geography
。您可以再试一次,如果结果与上面的类似,请让我知道更多详细信息,例如sdk或您文档的详细信息(我在Azure portal上对此进行了测试)。

是的,我在将单个文档添加到容器时看到类似的结果(包括索引命中计数=1)。当有数千个文档时会出现问题,它会扫描所有文档。是的,当仅将单个文档添加到容器(包括索引命中计数=1)时,我会看到类似的结果。当有数千个文档时会出现问题,它会扫描所有文档。