为什么默认情况下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 回答
Cosmos DB会对Array的所有元素编制索引 . 默认情况下,所有Azure Cosmos DB数据都已编制索引 . 在这里阅读更多https://docs.microsoft.com/en-us/azure/cosmos-db/indexing-policies
我能够用你要问的
ARRAY_CONTAINS
来重现这个问题 .使用来自SO数据转储的100,000个帖子设置CosmosDB集合(例如,此问题将表示如下)
然后执行以下查询
该查询使用默认索引策略获取了2,000多个RU,并在添加了以下内容时使用了93(如链接文章中所示)
但是你在这里看到的是 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 .