我使用数据存储区是全新的,我对过滤器有疑问。
这是我在java-objectify中定义的实体:
@Entity
public class Element {
@Id
private long id;
@Index
private String item1;
@Index
private Integer item2;
//(...) 3-39 items
@Index
private String item40;
}
我希望用户能够使用任何类型的过滤器组合过滤此“实体”的“种类”。
例如:
query = query.filter("item1 =", "Tokyo").filter("item25 <", 10).filter("item3 >" , 0);
要使用此过滤器,我需要创建索引,如下所示:
<datastore-index kind="Conference" ancestor="false"
source="auto">
<property name="item1" direction="asc" />
<property name="item25" direction="asc" />
<property name="item3" direction="asc" />
</datastore-index>
因此,要允许包含40个项目的所有过滤器组合,必须创建一个 非常多的索引
我的问题是:
Google DataStore是否专为这些类型的查询而设计?
还有其他方法让用户在过滤器中自由吗?
答案 0 :(得分:2)
不像你想的那样,由于zigzag merge join algorithm,灵活的过滤是可能的,但是只包括相等过滤器,对于不等式和排序你需要复合索引(上限为200) ,甚至是inequality filters are limited to at most one property。
所以最终不能正确使用这种数据库,你可以做的是想到更多面向任务的搜索过滤器(比如第一篇文章的例子,这是必读的),或设计你的查询围绕限制的界面,只提供相等过滤器,单一属性排序(因为每个属性都需要一个新的复合索引而你不想用完),只有一个空间用于不等式(只需要完全理解第二条中列出的限制)。