You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:20:40