2016-03-10 191 views
2

我想执行DocumentDB查询,看起来像SELECT * FROM c其中c.teams IN(@teamsList),包含(c.text, “一些字符串”)DocumentDB查询与Azure的搜索领域

问题在于上面的查询计算密集并且几乎超过了我们的S3收集限制(这个查询花费了2400RU,我们的数据集正在快速增长,我们将很快达到包含扫描限制)。

我知道,Azure的搜索是一种更有效的方式或搜索可转位字段。我的问题是如何有效地将Azure搜索的结果与其他查询字段合并,在我的示例中,通过团队列表限制它。我们有兴趣公开一个“查询构建器”(类似示例here),其中CONTAINS是任何字段上的允许操作数。

+0

如果给定的查询超时对于超出您的预算RU,它会用一个延续令牌,您可以使用再次回到了更多的数据返回。这有帮助吗?虽然Azure Search对您的CONTAINS子句更有效,但我不确定IN子句中是否会更好/更差。您可能想要针对您的数据集进行基准测试。 –

+1

关于第一个DocumentDB查询,你知道有多少个文档与查询中的查询过滤器相匹配吗? IN子句将通过索引进行过滤。如果您可以发布活动ID,我们可以调查为什么需要2400 RU。此外,如果您只需为查询构建器返回一页结果,则可以通过限制默认显示的结果数量来显着减少RU。 –

+0

查询SELECT TOP 100 * FROM c其中CONTAINS(c.details.title, “测试”)返回13分的结果和在天青门户消耗2409.98的RU。活动ID:6d966ad4-a196-4255-A10B-334a753a89e0 – Valchris

回答

0

如果你想使用DocumentDB对于包含文字搜索和避免扫描(不使用Azure的搜索),你可以做到以下几点:

  1. 您记号化text进言的数组。您可以使用像Lucene.NET这样的现成标记器。比方说,文字是“这是一个问题”
  2. 商店的话像text_tokens数组。 text_words的内容是[“this”,“is”,“question”](规范化为小写,并删除停用词)
  3. 使用ARRAY_CONTAINS(c.text_tokens,“word”)查询text_tokens中的值。这将使用索引。