【问题标题】:DocumentDB LinQ Request rate is largeDocumentDB LinQ 请求率大
【发布时间】:2026-01-16 18:00:01
【问题描述】:

我正在尝试使用 DocumentDB,一个小型数据库,并尝试在 C# 中使用 LinQ 对其中一个列进行文本搜索。执行查询时,我收到“请求率太高”错误消息并且数据返回非常慢。

数据库设置为 400RU。我仍在测试数据库,并且正在使用 LinQ 执行单个请求。

错误信息:

操作将在 9707 毫秒后重试。当前尝试 1, 累积延迟 00:00:09.7070000 例外: Microsoft.Azure.Documents.DocumentClientException:消息: {“错误”:[“请求率很大”]}

这是我的查询:

var feed = from c in _client.CreateDocumentQuery<DataModel.Company>(_collUri, new FeedOptions() { MaxItemCount = 20 })
                            where c.Name.ToLower().Contains(keyword.ToLower())
                            select new { c.CIK, c.Name, Index = c.Name.ToLower().IndexOf(keyword.ToLower()) };

文档结构:

{      
  "Company Name": "ABC Test Company, Inc.",
  "Meta": [],
  "Aux": [
    {
      "file Type": "T",
      "Date posted": "2017-01-20",
      "Filename": "ccc/data/1695034/a.txt"
    }
  ],
  "id": "1695034"
}

*Company.Name 映射到 DocumentDB 中的"Company Name" 字段

【问题讨论】:

    标签: c# linq azure azure-cosmosdb


    【解决方案1】:

    当您在查询的“WHERE”部分进行比较之前操作字段中的数据并且没有其他更具选择性的子句时,您会自动触发全表扫描(不使用索引)。所以,c.Name.ToLower() 就是这样一种操纵。

    您可以通过存储一个名称已经为小写的附加字段并在查询中使用该字段来解决此问题。

    【讨论】:

    • 是的 - 对于附加组件,跟踪特定请求需要多少 RU 很有帮助。您可以在此处找到有关如何执行此操作的详细信息:*.com/a/34057204/319795
    • 在该字段上添加了一个字段和一个新的 Range 索引策略。通过这些更改,STARTSWITH 开始工作,但 CONTAINS 仍然收到“请求率很大”错误。这是查询:SELECT TOP 20 * FROM c where CONTAINS(c.NameIndex, "test") REQUEST CHARGE: 2313.41 RUs 任何其他建议请...
    • 当您将CONTAINS 切换为STARTSWITH 时会发生什么?我的理论是CONTAINS 不使用索引。如果你真的需要这种文本搜索,那么你可能想要一个像下面@Matias 建议的文本搜索引擎。
    【解决方案2】:

    如果您要进行文本搜索,我建议在 DocumentDB 之上使用Azure Search

    您可以使用Indexers 对 DocumentDB 上的信息进行索引。

    Azure 搜索会在这些情况下(文本搜索)产生更好的搜索体验,并且不会影响您的 DocumentDB 吞吐量。它有自己的服务费,所以应该考虑在内。如果您的应用程序将严重依赖文本搜索功能,那么它可能是最佳选择。

    如需更详细的服务描述,以下文章可能会有所帮助:

    【讨论】:

    • 我了解 Azure 搜索可能会起作用。但是对于像我的用例这样的简单低容量应用程序,我不想创建多个服务的依赖链。如果 DocumentDB 很简单,这不是承诺吗?我们甚至还没有进行复杂的查询。
    • 问题在于查询的文本搜索性质,尤其是 DocDB 在该字段上的限制。就像@Larry 提到的那样,您可以尝试使用CONTAINSSTARTSWITH 运算符,看看它们是否有帮助,但它们不使用索引。请查看this question 并添加到this User Request