我正在尝试使用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"
字段
答案 0 :(得分:4)
如果在查询的“WHERE”部分中进行比较之前操作字段中的数据并且没有其他更多选择性子句,则会自动触发全表扫描(不使用索引)。所以,c.Name.ToLower()
只是一种操纵。
您可以通过存储名称已经小写且在查询中使用该字段的其他字段来解决此问题。
答案 1 :(得分:0)
如果您要进行文字搜索,我建议您在DocumentDB之上使用Azure Search。
您可以使用Indexers索引DocumentDB上的信息。
Azure搜索在这些情况下(文本搜索)会产生更好的搜索体验,并且不会对您的DocumentDB吞吐量产生影响。它有它自己的服务费,所以应该考虑到它。如果您的应用程序在很大程度上依赖于文本搜索功能,那么它可能是最佳选择。
有关更详细的服务说明,以下是一些可能有用的文章: