首页 文章

在CosmosDB中索引数组

提问于
浏览
5

为什么默认情况下CosmosDB没有索引数组?默认索引路径是

"path": "/*"

这不是指“索引一切”吗?不是“除了数组之外的所有索引” .

如果我将我的数组字段添加到索引中,如下所示:

"path": "/tags/[]/?"

它将工作并开始索引特定的数组字段 .

但我的问题是为什么不“索引一切”索引一切?

编辑:这里's a blog post that describes the behavior I'我看到了 . http://www.devwithadam.com/2017/08/querying-for-items-in-array-in-cosmosdb.html Array_Contains查询非常慢,显然没有使用索引 . 如果您明确地将相关字段添加到索引中,那么查询很快(显然它们开始使用索引) .

2 回答

  • -3

    Cosmos DB会对Array的所有元素编制索引 . 默认情况下,所有Azure Cosmos DB数据都已编制索引 . 在这里阅读更多https://docs.microsoft.com/en-us/azure/cosmos-db/indexing-policies

  • 5

    我能够用你要问的 ARRAY_CONTAINS 来重现这个问题 .

    使用来自SO数据转储的100,000个帖子设置CosmosDB集合(例如,此问题将表示如下)

    {
        "id": "50614926",
        "title": "Indexing arrays in CosmosDB",
         /*Other irrelevant properties omitted */
        "tags": [
            "azure",
            "azure-cosmosdb"
        ]
    }
    

    然后执行以下查询

    SELECT COUNT(1)
    FROM t IN c.tags
    WHERE t = 'sql-server'
    

    该查询使用默认索引策略获取了2,000多个RU,并在添加了以下内容时使用了93(如链接文章中所示)

    {
        "path": "/tags/[]/?",
        "indexes": [
            {
                "kind": "Hash",
                "dataType": "String",
                "precision": -1
            }
        ]
    }
    

    但是你在这里看到的是 not ,默认情况下数组值没有被索引 . 只是默认范围索引对您的查询没有用 .

    范围索引使用基于部分前向路径的键 . 因此将包含如下路径 .

    • tags/0/azure

    • tags/0/c#

    • tags/0/oracle

    • tags/0/sql-server

    • tags/1/azure-cosmosdb

    • tags/1/c#

    • tags/1/sql-server

    使用此索引结构,它从 tags/0/sql-server 开始,然后读取 tags/n/ 的所有剩余 tags/0/ 条目和整个条目,其中 n 是大于 0 的整数 . 需要检索和评估映射到这些中的任何一个的每个不同文档 .

    相比之下,哈希索引使用反向路径(more details - PDF

    StackOverflow理论上允许UI添加每个问题最多5个标签,因此在这种情况下(忽略一些问题通过站点管理活动有更多标签的事实),感兴趣的反向路径是

    • sql-server/0/tags

    • sql-server/1/tags

    • sql-server/2/tags

    • sql-server/3/tags

    • sql-server/4/tags

    使用反向路径结构查找具有值为sql-server的叶节点的所有路径是直截了当的 .

    在这个特定的用例中,当数组被限制为最多5个可能的值时,也可以通过仅查看那些特定路径来有效地使用原始范围索引 .

    以下查询在我的测试集合中使用了具有默认索引策略的97个RU .

    SELECT COUNT(1)
    FROM c
    WHERE  'sql-server' IN (c.tags[0], c.tags[1], c.tags[2], c.tags[3], c.tags[4])
    

相关问题