Azure Cosmos DB 如何为数据编制索引?

默认情况下为所有 Azure Cosmos DB 数据编制索引。 尽管许多客户都愿意让 Azure Cosmos DB 自动处理索引的方方面面,但你可在 Azure Cosmos DB 中在创建过程中为集合指定自定义索引策略。 Azure Cosmos DB 中的索引策略比其他数据库平台中提供的辅助索引更加灵活和强大。 在 Azure Cosmos DB 中,可设计和自定义索引的形状,无需牺牲架构的灵活性。

要了解 Azure Cosmos DB 中的索引工作原理,管理索引策略时了解它至关重要,可以在索引存储开销、写入和查询吞吐量以及查询一致性之间进行细致权衡。

在本文中,我们将仔细研究 Azure Cosmos DB 索引策略、自定义索引策略的方法和相关的权衡方案。

阅读本文后,可以回答以下问题:

  • 如何重写属性以包括在索引中或从索引中排除?
  • 如何为最终更新配置索引?
  • 如何配置索引以执行 ORDER BY 或范围查询?
  • 如何对集合的索引策略进行更改?
  • 如何比较不同索引策略的存储和性能?

自定义集合的索引策略

通过重写 Azure Cosmos DB 集合的默认索引策略,可以在存储、写入/查询性能和查询一致性之间进行权衡。 可配置以下几个方面:

  • 包括或排除索引的文档和路径。 插入或替换集合中的文档时,可在索引中排除或包括特定的文档。 还可包括或排除特定的 JSON 属性(也称为路径),以便在包括在索引中的文档中建立索引。 路径包括通配符模式。
  • 配置各种索引类型。 对于每个包含的路径,可指定路径针对集合而要求的索引类型。 可根据路径的数据、预期的查询工作负荷和数字/字符串“精准度”来指定索引的类型。
  • 配置索引更新模式。 Azure Cosmos DB 支持三种索引模式:一致、延迟和无。 可通过 Azure Cosmos DB 集合上的索引策略来配置索引模式。

以下 Microsoft .NET 代码片段演示了如何在创建集合时设置自定义索引策略。 在此示例中,我们以最大精度为字符串和数字设置范围索引策略。 可使用此策略对字符串执行 ORDER BY 查询。

DocumentCollection collection = new DocumentCollection { Id = "myCollection" };

collection.IndexingPolicy = new IndexingPolicy(new RangeIndex(DataType.String) { Precision = -1 });
collection.IndexingPolicy.IndexingMode = IndexingMode.Consistent;

await client.CreateDocumentCollectionAsync(UriFactory.CreateDatabaseUri("db"), collection);   

Note

索引策略的 JSON 架构在发布 REST API 版本 2015-06-03 时发生了改变。 在该版本中,索引策略的 JSON 架构支持针对字符串的范围索引。 .NET SDK 1.2.0 和 Java、Python 和 Node.js SDK 1.1.0 支持新策略架构。 早期版本的 SDK 使用 REST API 版本 2015-04-08。 它们支持早期的索引策略架构。

默认情况下,Azure Cosmos DB 使用哈希索引对文档中的所有字符串属性一致地编制索引。 它使用范围索引对文档中的所有数字属性一致地编制索引。

自定义门户中的索引策略

可在 Azure 门户中更改集合的索引策略:

  1. 在门户中,转到 Azure Cosmos DB 帐户,然后选择集合。
  2. 在左侧导航菜单中,选择“设置”,然后选择“索引策略”。
  3. 在“索引策略”下,更改索引策略,然后选择“确定”。

数据库索引模式

Azure Cosmos DB 支持三种索引模式,可通过索引策略对 Azure Cosmos DB 集合进行配置:一致、延迟和无。

一致:如果 Azure Cosmos DB 集合的策略为“一致”,针对特定 Azure Cosmos DB 集合的查询将按照为点读取指定的一致性级别进行(强、有限过期性、会话或最终)。 索引会作为文档更新(插入、替换、更新和删除 Azure Cosmos DB 集合中的文档)的一部分进行同步更新。

一致索引支持一致的查询,但代价是可能降低写入吞吐量。 这种减少受需要索引的唯一路径和“一致性级别”的影响。 一致的索引模式适用于“快速写入、立即查询”工作负荷。

延迟:Azure Cosmos DB 集合处于静止状态时(即处理用户请求时没有完全利用集合的吞吐容量),以异步方式更新索引。 请注意,因为数据引入和索引速度缓慢,可能出现不一致的结果。 这意味着在给定时间 COUNT 查询或特定的查询结果可能是不一致或重复的。

索引通常处于所引入数据的追赶模式。 使用延迟索引,生存时间 (TTL) 更改会导致删除并重新创建索引。 这使得 COUNT 和查询结果在一段时间内不一致。 大多数 Azure Cosmos DB 帐户应使用“一致”索引模式。

:索引模式为“无”的集合没有与之关联的索引。 如果 Azure Cosmos DB 用作键值存储,并且只通过文档的 ID 属性访问文档,则通常使用该模式。

Note

将索引策略配置为“无”时,有着删除任何现有索引这种不良影响。 如果访问模式只需要 ID 或“自助链接”,请使用此选项。

下表显示了基于为集合配置的索引模式(一致和延迟)和为查询请求指定的一致性级别进行的查询的一致性。 这适用于使用任何接口:REST API、SDK 或在存储过程和触发器中进行的查询。

一致性 索引模式:一致 索引模式:延迟
最终
有限过期 有限过期 最终
会话 会话 最终
最终 最终 最终

在“无”索引模式下查询集合时,Azure Cosmos DB 会返回一个错误。 查询仍然可作为扫描执行,通过 REST API 中的显式 -ms-documentdb-enable-scan 头或使用 .NET SDK 的 EnableScanInQuery 请求选项完成。 EnableScanInQuery 不支持诸如 ORDER BY 等查询功能作为扫描来执行。

下表显示了指定 EnableScanInQuery 时,根据索引模式(一致、延迟和无)进行查询的一致性。

一致性 索引模式:一致 索引模式:延迟 索引模式:无
最终
有限过期 有限过期 最终 有限过期
会话 会话 最终 会话
最终 最终 最终 最终

下面的代码示例演示如何使用 .NET SDK 借助针对所有文档插入的一致索引创建 Azure Cosmos DB 集合。

 // Default collection creates a Hash index for all string fields and a Range index for all numeric    
 // fields. Hash indexes are compact and offer efficient performance for equality queries.

 var collection = new DocumentCollection { Id ="defaultCollection" };

 collection.IndexingPolicy.IndexingMode = IndexingMode.Consistent;

 collection = await client.CreateDocumentCollectionAsync(UriFactory.CreateDatabaseUri("mydb"), collection);

索引路径

Azure Cosmos DB 将 JSON 文档和索引建模为树。 可调整树中路径的策略。 在文档中,可选择要包括在索引中或从索引中排除的路径。 如果事先已知查询模式,这可以提高写入性能并减少方案所需的索引存储。

索引路径以根 (/) 开头,并常以 ? 通配符运算符。 这表示前缀存在多个可能的值。 例如,对于 SELECT * FROM Families F WHERE F.familyName = "Andersen",必须在集合的索引策略中包含 /familyName/? 的索引路径。

索引路径还可以使用 * 通配符运算符以递归方式指定路径在前缀下的行为。 例如,/payload/* 可用于从索引中排除负载属性下的所有内容。

下面是用于指定索引路径的常用模式:

路径 说明/用例
/ 集合的默认路径。 递归并应用于整个文档树。
/prop/? 执行查询所需的索引路径(分别为哈希或范围类型):

SELECT FROM collection c WHERE c.prop = "value"

SELECT FROM collection c WHERE c.prop > 5

SELECT FROM collection c ORDER BY c.prop
/prop/* 指定标签下所有路径的索引路径。 用于以下查询

SELECT FROM collection c WHERE c.prop = "value"

SELECT FROM collection c WHERE c.prop.subprop > 5

SELECT FROM collection c WHERE c.prop.subprop.nextprop = "value"

SELECT FROM collection c ORDER BY c.prop
/props/[]/? 针对诸如 ["a"、"b"、"c"] 的标量数组进行迭代和 JOIN 查询所需的索引路径:

SELECT tag FROM tag IN collection.props WHERE tag = "value"

SELECT tag FROM collection c JOIN tag IN c.props WHERE tag > 5
/props/[]/subprop/? 针对诸如 [{subprop:"a"}, {subprop:"b"}] 的对象数组进行迭代和 JOIN 查询所需的索引路径:

SELECT tag FROM tag IN collection.props WHERE tag.subprop = "value"

SELECT tag FROM collection c JOIN tag IN c.props WHERE tag.subprop = "value"
/prop/subprop/? 进行查询所需的索引路径(分别为哈希或范围类型):

SELECT FROM collection c WHERE c.prop.subprop = "value"

SELECT FROM collection c WHERE c.prop.subprop > 5

Note

在设置自定义索引路径时,需要为由特殊路径“/*”表示的整个文档树指定默认索引规则。

下面的示例通过范围索引和 20 个字节的自定义精度值来配置特定路径:

    var collection = new DocumentCollection { Id = "rangeSinglePathCollection" };    

    collection.IndexingPolicy.IncludedPaths.Add(
        new IncludedPath { 
            Path = "/Title/?", 
            Indexes = new Collection<Index> { 
                new RangeIndex(DataType.String) { Precision = 20 } } 
            });

    // Default for everything else
    collection.IndexingPolicy.IncludedPaths.Add(
        new IncludedPath { 
            Path = "/*" ,
            Indexes = new Collection<Index> {
                new HashIndex(DataType.String) { Precision = 3 }, 
                new RangeIndex(DataType.Number) { Precision = -1 } 
            }
        });

    collection = await client.CreateDocumentCollectionAsync(UriFactory.CreateDatabaseUri("db"), pathRange);

添加路径以进行索引时,会对这些路径中的数字和字符串进行索引。 因此,即使只为字符串定义索引,Azure Cosmos DB 也会为数字添加默认定义。 换句话说,Azure Cosmos DB 可以从索引策略中排除路径,但不能从特定路径中排除类型。 下面是一个示例,请注意,只为两个路径(路径 =“/*”和路径 =“/"attr1"/?”)指定了一个索引,但数字数据类型也添加到结果中。

var indices = new[]{
                new IncludedPath  {
                    Indexes = new Collection<Index>
                    {
                        new RangeIndex(DataType.String) { Precision = 3 }// <- note: only 1 index specified
                    },
                    Path =  "/*"
                },
                new IncludedPath  {
                    Indexes = new Collection<Index>
                    {
                        new RangeIndex(DataType.String) { Precision = 3 } // <- note: only 1 index specified
                    },
                    Path =  "/\"attr1\"/?"
                }
            };...

            foreach (var index in indices)
            {
                documentCollection.IndexingPolicy.IncludedPaths.Add(index);
            }

创建索引的结果:

{
    "indexingMode": "consistent",
    "automatic": true,
    "includedPaths": [
        {
            "path": "/*",
            "indexes": [
                {
                    "kind": "Range",
                    "dataType": "String",
                    "precision": 3
                },
                {
                    "kind": "Range",
                    "dataType": "Number",
                    "precision": -1
                }
            ]
        },
        {
            "path": "/\"attr\"/?",
            "indexes": [
                {
                    "kind": "Range",
                    "dataType": "String",
                    "precision": 3
                },
                {
                    "kind": "Range",
                    "dataType": "Number",
                    "precision": -1
                }
            ]
        }
    ],
}

索引数据类型、种类和精度

配置路径的索引策略时,有多个选项。 可以为每个路径指定一个或多个索引定义:

  • 数据类型:String、Number、Point、Polygon 或 LineString(每个路径每种数据类型只能包含一个条目)。
  • 索引种类:哈希(等式查询)、范围(等式、范围或 ORDER BY 查询)或空间(空间查询)。
  • 精度:对于字符串和数字的哈希索引,此值从 1 到 8 变化。 默认值为 3。 对于范围索引,此值可为 -1(最大精度)。 对于字符串或数字值,它可以在 1 到 100 之间变化(最大精度)。

索引种类

Azure Cosmos DB 针对每个路径都支持哈希和范围两种索引(可为字符串和/或数值数据类型配置这两种索引)。

  • 哈希 支持高效的等式查询和联接查询。 在大多数使用情况下,哈希索引需要的精度不会高于 3 个字节的默认值。 数据类型可以是字符串或数字。
  • 范围支持高效的等式查询、范围查询(使用 >、<、>=、<=、!=)和 ORDER BY 查询。 默认情况下,ORDER BY 查询还需要最大索引精度 (-1)。 数据类型可以是字符串或数字。

Azure Cosmos DB 还针对每个路径支持空间索引类型,可为 Point、Polygon 或 LineString 数据类型指定该索引类型。 指定路径中的值必须是有效的 GeoJSON 片段,如 {"type": "Point", "coordinates": [0.0, 10.0]}

  • “空间”支持高效的空间(在其中和距离)查询。 数据类型可以是 Point、Polygon 或 LineString。

Note

Azure Cosmos DB 支持为 Point、Polygon 和 LineString 数据类型自动编制索引。

下面是支持的索引种类以及可以使用的查询示例:

索引种类 说明/用例
哈希 对 /prop/?(或 /)应用哈希索引 (or /) 可用于有效完成下列查询:

SELECT FROM collection c WHERE c.prop = "value"

对 /props/[]/?(或 / 和 /props/)应用哈希索引 可用于有效完成下列查询:

SELECT tag FROM collection c JOIN tag IN c.props WHERE tag = 5
范围 对 /prop/?(或 /)应用范围索引 可用于有效完成下列查询:

SELECT FROM collection c WHERE c.prop = "value"

SELECT FROM collection c WHERE c.prop > 5

SELECT FROM collection c ORDER BY c.prop
空间 /prop/? 可用于有效完成下列查询:

SELECT FROM collection c

WHERE ST_DISTANCE(c.prop, {"type": "Point", "coordinates": [0.0, 10.0]}) < 40

SELECT FROM collection c WHERE ST_WITHIN(c.prop, {"type": "Polygon", ... }) --启用对点的索引编制

SELECT FROM collection c WHERE ST_WITHIN({"type": "Point", ... }, c.prop) --启用对多边形的索引编制

默认情况下,如果没有范围索引(任何精度),则使用范围运算符(如 >=)的查询会返回错误,以提示执行查询必须执行一次扫描。 使用 REST API 中的 x-ms-documentdb-enable-scans 标头或使用 .NET SDK 的 EnableScanInQuery 请求选项,可以在没有范围索引的情况下执行范围查询。 如果在查询中有 Azure Cosmos DB 可以使用索引据其进行筛选的其他筛选器,则不返回错误。

空间查询的规则相同。 默认情况下,如果没有空间索引,并且索引中没有其他筛选器可以使用,则空间查询会返回错误。 可以使用 x-ms-documentdb-enable-scan 或 EnableScanInQuery 以扫描方式执行空间索引。

索引精度

可使用索引精度在索引存储开销和查询性能之间做出权衡。 对于数值,我们建议使用默认的精度配置 -1(最大)。 因为数字是 JSON 格式的 8 个字节,这相当于 8 个字节的配置。 选择较低值的精度(如 1-7)意味着在某些范围内的值会映射到相同的索引条目。 因此,可减少索引存储空间,但查询执行可能需要处理更多文档。 因此,它在请求单位中占用更多吞吐量。

索引精度配置对于字符串范围更加实用。 由于字符串可以是任意长度,索引精度的选择可能会影响字符串范围查询的性能。 也可能影响所需索引存储空间量。 字符串范围索引可以配置为 1-100 或 -1(最大)。 如果想要对字符串属性执行 ORDER BY 查询,则必须为相应路径指定精度 -1。

空间索引始终为所有类型(Point、LineString 和 Polygon)使用默认索引精度。 无法重写空间索引的默认索引精度。

下面的示例演示了如何使用 .NET SDK 来提高集合中范围索引的精度。

创建自定义索引精度的集合

var rangeDefault = new DocumentCollection { Id = "rangeCollection" };

// Override the default policy for strings to Range indexing and "max" (-1) precision
rangeDefault.IndexingPolicy = new IndexingPolicy(new RangeIndex(DataType.String) { Precision = -1 });

await client.CreateDocumentCollectionAsync(UriFactory.CreateDatabaseUri("db"), rangeDefault);   

Note

当查询使用 ORDER BY,但针对最大精度的查询路径没有范围索引时,Azure Cosmos DB 会返回一个错误。

同样,可从索引中完全排除路径。 下一示例演示如何使用 * 通配符运算符从索引中排除整个文档部分(子树)。

var excluded = new DocumentCollection { Id = "excludedPathCollection" };
excluded.IndexingPolicy.IncludedPaths.Add(new IncludedPath { Path = "/*" });
excluded.IndexingPolicy.ExcludedPaths.Add(new ExcludedPath { Path = "/nonIndexedContent/*" });

await client.CreateDocumentCollectionAsync(UriFactory.CreateDatabaseUri("db"), excluded);

选择加入和选择退出索引

可以选择是否让集合自动为所有文档编制索引。 默认情况下,为所有文档自动执行索引,但可关闭自动索引。 关闭索引功能后,只能通过本身的链接或通过使用文档 ID 进行查询的方法访问文档。

关闭自动索引后,仍然可以选择性地只将特定的文档添加到索引中。 相反,可以保留自动索引,并选择排除特定的文档。 当只需要查询一个文档子集时,索引开/关配置非常有用。

下面的示例演示了如何使用 SQL API .NET SDKRequestOptions.IndexingDirective 属性来显式包括文档。

// If you want to override the default collection behavior to either
// exclude (or include) a document in indexing,
// use the RequestOptions.IndexingDirective property.
client.CreateDocumentAsync(UriFactory.CreateDocumentCollectionUri("db", "coll"),
    new { id = "AndersenFamily", isRegistered = true },
    new RequestOptions { IndexingDirective = IndexingDirective.Include });

修改集合的索引策略

在 Azure Cosmos DB 中,可动态更改集合的索引策略。 Azure Cosmos DB 集合上索引策略的更改可能会导致索引形状的更改。 此更改会影响可编制索引的路径、其精度以及索引本身的一致性模型。 索引策略的更改实际上要求将旧索引转换为新索引。

联机索引转换

索引工作原理 - Azure Cosmos DB 联机索引转换

索引转换是联机进行的。 这意味着按照旧策略索引的文档可以按照新策略有效转换,而不会影响集合的写入可用性或预配的吞吐量。 在索引转换过程中,使用 REST API、SDK 或在存储过程和触发器中执行读取和写入操作的一致性不会受到影响。

更改索引策略是一个异步过程,完成操作的时间取决于文档数量、预配的 RU 和文档大小。 在重新编制索引的过程中,如果查询使用的是正在修改的索引,则查询可能不会返回所有匹配的结果且不会返回任何错误/失败。 虽然正在重新编制索引,但是,无论索引模式配置如何(一致或延迟),期间查询始终一致。 索引转换完成后,将继续看到一致的结果。 这适用于使用所有接口(REST API、SDK)或从存储过程和触发器中进行的查询。 与延迟索引一样,使用特定副本可用的备用资源在后台以异步方式对副本执行索引转换。

索引转换也已到位。 Azure Cosmos DB 不维护索引的两个副本,并用新索引替换旧索引。 这就意味着,索引转换发生时集合中不需要也不占用额外的磁盘空间。

更改索引策略时,更改得到应用,主要基于索引模式配置从旧索引移动到新索引。 索引模式配置比包括/排除路径、索引种类和精度等其他值具有更大的作用。

如果新旧策略都使用一致的索引,则 Azure Cosmos DB 执行联机索引转换。 转换正在进行时,不能应用一致索引模式下的其他索引策略更改。 但是在进行转换时,可以切换到延迟或无索引模式:

  • 移动到“延迟”时,索引策略更改立即生效。 Azure Cosmos DB 开始以异步方式重新创建该索引。
  • 当切换到“无”模式时,会立即删除索引。 当想要取消正在进行的转换,并开始使用不同的索引策略时,切换到“无”模式非常有用。

以下代码段演示了如何将集合的索引策略从“一致”索引模式改为“延迟”索引模式。 如果使用 .NET SDK,则可使用新的 ReplaceDocumentCollectionAsync 方法启动索引策略更改。

将索引策略从一致改为延迟

// Switch to Lazy indexing mode.
Console.WriteLine("Changing from Default to Lazy IndexingMode.");

collection.IndexingPolicy.IndexingMode = IndexingMode.Lazy;

await client.ReplaceDocumentCollectionAsync(collection);

跟踪索引转换进度

通过使用 ReadDocumentCollectionAsync 调用中的 IndexTransformationProgress 响应属性,可跟踪转换为一致索引的索引转换的进度百分比。 其他 SDK 和 REST API 支持使用等效属性和方法进行索引策略更改。 可以通过调用 ReadDocumentCollectionAsync 来查看转换为一致索引的索引转换的进度:

long smallWaitTimeMilliseconds = 1000;
long progress = 0;

while (progress < 100)
{
    ResourceResponse<DocumentCollection> collectionReadResponse = await client.ReadDocumentCollectionAsync(
        UriFactory.CreateDocumentCollectionUri("db", "coll"));

    progress = collectionReadResponse.IndexTransformationProgress;

    await Task.Delay(TimeSpan.FromMilliseconds(smallWaitTimeMilliseconds));
}

Note

  • 仅在转换为一致索引时,IndexTransformationProgress 属性才适用。 使用 ResourceResponse.LazyIndexingProgress 属性来跟踪转换为延迟索引。
  • 仅为非分区集合(即不使用分区键创建的集合)填充 IndexTransformationProgress 和 LazyIndexingProgress 属性。

通过切换到无索引模式,可以删除集合的索引。 如果想要取消正在进行的转换并立即启动一个新的索引,这个操作工具可能非常有用。

删除集合的索引

// Switch to Lazy indexing mode.
Console.WriteLine("Dropping index by changing to the None IndexingMode.");

collection.IndexingPolicy.IndexingMode = IndexingMode.None;

await client.ReplaceDocumentCollectionAsync(collection);

何时更改 Azure Cosmos DB 集合的索引策略? 以下使用案例最常见:

  • 在正常操作中提供一致的结果,但在批量数据导入时返回到延迟索引模式。
  • 开始在当前的 Azure Cosmos DB 集合上使用新的索引功能。 例如,可使用地理空间查询,这需要空间索引种类;或使用 ORDER BY /字符串范围查询,这需要字符串范围索引种类。
  • 手动选择要编制索引的属性,并随着时间的推移进行更改。
  • 调整索引精度,以提高查询性能或减少占用的存储。

Note

若要使用 ReplaceDocumentCollectionAsync 修改索引策略,必须安装不低于 1.3.0 或更高版本的 .NET SDK。

要成功完成索引转换,请确保集合有足够的可用存储空间。 如果集合达到其存储配额,暂停索引转换。 获得可用的存储空间后(例如删除某些文档),索引转换自动恢复。

性能调优

SQL API 提供有关性能指标的信息,如所用的索引存储以及每次操作的吞吐量成本(请求单位)。 此信息可用于比较各种索引策略和优化性能。

若要检查存储配额和集合使用情况,请针对集合资源运行 HEAD 或 GET 请求。 然后检查 x-ms-request-quota 和 x-ms-request-usage 标头。 在 .NET SDK 中,ResourceResponse<T> 中的 DocumentSizeQuotaDocumentSizeUsage 属性包含这些相应的值。

 // Measure the document size usage (which includes the index size) against   
 // different policies.
 ResourceResponse<DocumentCollection> collectionInfo = await client.ReadDocumentCollectionAsync(UriFactory.CreateDocumentCollectionUri("db", "coll"));  
 Console.WriteLine("Document size quota: {0}, usage: {1}", collectionInfo.DocumentQuota, collectionInfo.DocumentUsage);

若要度量每个写入操作(创建、更新或删除)执行索引的开销,请检查 x-ms-request-charge 标头(或 .NET SDK 中 ResourceResponse<T> 的等效 RequestCharge 属性)来度量这些操作占用的请求单位数。

 // Measure the performance (request units) of writes.     
 ResourceResponse<Document> response = await client.CreateDocumentAsync(UriFactory.CreateDocumentCollectionUri("db", "coll"), myDocument);              
 Console.WriteLine("Insert of document consumed {0} request units", response.RequestCharge);

 // Measure the performance (request units) of queries.    
 IDocumentQuery<dynamic> queryable =  client.CreateDocumentQuery(UriFactory.CreateDocumentCollectionUri("db", "coll"), queryString).AsDocumentQuery();

 double totalRequestCharge = 0;
 while (queryable.HasMoreResults)
 {
    FeedResponse<dynamic> queryResponse = await queryable.ExecuteNextAsync<dynamic>(); 
    Console.WriteLine("Query batch consumed {0} request units",queryResponse.RequestCharge);
    totalRequestCharge += queryResponse.RequestCharge;
 }

 Console.WriteLine("Query consumed {0} request units in total", totalRequestCharge);

对索引策略规范的更改

在 REST API 2015-06-03 版本中,于 2015 年 7 月 7 日对索引策略的架构进行了更改。 SDK 版本中的相应类具有与架构匹配的新实现。

JSON 规范中实现了以下更改:

  • 索引策略针对字符串支持范围索引。
  • 每个路径可以有多个索引定义。 每种数据类型可有一个。
  • 对于数字,索引精度支持 1-8,对于字符串支持 1-100,-1 为最大精度。
  • 路径段不需要双引号来转义每个路径。 例如,可以添加 /title/? 路径 而不是 /"title"/?。
  • 表示“所有路径”的根路径可以表示为 /*(除了 /)。

如果代码使用 1.1.0 或更早版本的 .NET SDK 编写的自定义索引策略设置集合,要迁移到 SDK 1.2.0 版本,必须更改应用程序代码来处理这些更改。 如果没有用于配置索引策略的代码,或打算继续使用 SDK 更早版本,则不需进行任何更改。

为了便于比较,以下是使用 REST API 版本 2015-06-03 编写的自定义索引策略的示例,其后是使用较早 REST API 版本 2015-04-08 编写的相同索引策略。

当前的索引策略 JSON(REST API 版本 2015-06-03)

{
   "automatic":true,
   "indexingMode":"Consistent",
   "includedPaths":[
      {
         "path":"/*",
         "indexes":[
            {
               "kind":"Hash",
               "dataType":"String",
               "precision":3
            },
            {
               "kind":"Hash",
               "dataType":"Number",
               "precision":7
            }
         ]
      }
   ],
   "ExcludedPaths":[
      {
         "path":"/nonIndexedContent/*"
      }
   ]
}

更早的索引策略 JSON(REST API 版本 2015-04-08)

{
   "automatic":true,
   "indexingMode":"Consistent",
   "IncludedPaths":[
      {
         "IndexType":"Hash",
         "Path":"/",
         "NumericPrecision":7,
         "StringPrecision":3
      }
   ],
   "ExcludedPaths":[
      "/\"nonIndexedContent\"/*"
   ]
}

后续步骤

有关索引策略管理示例以及有关 Azure Cosmos DB 查询语言的详细信息,请参阅以下链接: