【发布时间】:2020-03-06 01:06:43
【问题描述】:
在设计仅键查询以过滤 Google 数据存储实体时,我生成了许多复合索引,它们是另一个索引的子集。是否可以对过滤已编入索引的属性子集的查询使用相同的复合索引?例如,如果我有以下仅键查询,是否有可能少于三个索引?
Query 1: Entities where a = 1, b = 1, c = 1;
Query 2: Entities where a = 1, b = 1;
Query 3: Entities where a = 1;
这是我正在使用的实际查询的示例:
Query<Key> query = Query.newKeyQueryBuilder()
.setKind("track")
.setFilter(CompositeFilter.and(PropertyFilter.eq("status", 1), PropertyFilter.eq("bpm", 138), PropertyFilter.eq("artist", "AVB"), PropertyFilter.eq("label", "Armada")))
.setOrderBy(OrderBy.asc("date"))
.build();
【问题讨论】:
-
是的,我相信查询集可以使用三个内置索引和零个复合索引。查看cloud.google.com/datastore/docs/concepts/optimize-indexes。
-
当我尝试运行过滤属性子集的查询时,我收到“未找到匹配索引”异常。
-
您是否在使用“>”之类的非等式过滤器?请注意,索引合并仅适用于“=”过滤器。你能发布一个代码 sn-p 显示你需要什么样的过滤器?
-
我忘了提到查询也有一个 OrderBy 过滤器。我已更新问题以显示示例。其他查询与示例相同,只是它们从组合中逐一删除属性过滤器并过滤,直到“状态”属性上只有一个过滤器。
-
顺便说一句,如果您对optimizing indexes 文档页面有任何反馈,我们将不胜感激。