Cosmos DB SQL索引策略:如何仅索引特定属性?
正确配置Cosmos DB仅指定属性索引的策略及分区键/ID索引说明
嘿,我来帮你搞定这个Cosmos DB索引配置的问题,分两部分给你讲明白:
一、实现仅对property1建索引的正确配置
你之前的配置已经修正了语法错误(把"path". "/*"改成"path": "/*"),要实现仅对property1建立索引,其余所有自定义属性不索引,最终的索引策略JSON应该是这样的:
{ "indexingMode": "consistent", "automatic": true, "includedPaths": [ { "path": "/property1/?", "indexes": [ { "kind": "Range", "dataType": "String", "precision": -1 } ] } ], "excludedPaths": [ { "path": "/*" } ] }
关键细节解释:
excludedPaths里的"/*"表示排除根路径下所有自定义属性的索引,直接覆盖Cosmos DB默认的全字段索引行为。includedPaths里的"/property1/?"是显式指定为property1创建全精度字符串范围索引,这个规则会优先于excludedPaths,所以property1会被单独索引。
至于你遇到的.NET Core客户端报错“查询非索引字段”,大概率是你的查询语句用到了property1以外的未索引字段(比如过滤条件里用了property2,或者查询返回了未索引字段)。如果确实需要查询这些字段,可以在查询选项中开启扫描(不推荐,会严重拖慢性能):
var queryOptions = new QueryRequestOptions { EnableScanInQuery = true }; // 示例:查询未索引字段时开启扫描 var query = container.GetItemQueryIterator<MyDocument>( "SELECT * FROM c WHERE c.property2 = 'c'", requestOptions: queryOptions );
更符合你需求的做法是:确保查询只涉及已索引的property1字段,避免扫描未索引内容。
二、Partition Key和ID的索引无需手动配置
完全不需要在索引策略里手动添加partitionKey和id的索引,Cosmos DB会自动为这两个系统字段创建唯一索引,不受excludedPaths的影响:
id是文档的唯一标识,Cosmos DB强制为其创建全局唯一索引(同一分区键下id唯一),保证你能精准通过id查询文档。partitionKey是分区的核心依据,系统会自动为其创建索引,确保分区内的查询效率,同时配合id实现全局唯一性约束。
所以哪怕你配置了excludedPaths": [{"path": "/*"}],这两个字段的索引依然正常工作,放心用它们做查询即可。
内容的提问来源于stack exchange,提问作者Oddleif
相关产品推荐
相关产品推荐

