情况:我计划为数据存储区中的一组对象提供标记支持。标签应该是可搜索的,因此必须对它们编制索引。我最担心的当然是爆炸指数。
以下情况是否可能导致索引爆炸:
问题1:我主要是试图完全理解我们的标签索引可能会变得多么具有爆炸性。上述情况是否会导致一个非常爆炸性的指数?
问题2:是否有任何建议的最佳做法来管理数据存储区中的标记?
跟进 - 通过关系索引进行数据查找 作为对象中标记的替代,如何使用单独的标记存储对象,如下所示:
TagStore {
private String tag;
private String fooId;
private long timestamp;
}
使用上述方法,请考虑以下场景:我们希望将对象Foo的实例与标签" cat"," horse"和" funicular&#相关联34 ;.在这种情况下,我们创建并保存Foo实例并创建并保存3个单独的TagStore实例,每个TagStore实例都有自己的标记,并通过其fooId指向Foo。
通过TagStore获取Foo: 用于检索最近被标记的Foo实例" cat"你首先要选择:
SELECT TagStore WHERE tag=cat ORDER BY timestamp;
然后,通过GQL响应,您可以通过
设置fooSELECT Foo where Foo.id IN ({Set of foo id's here})
我认为这是一种更结构化的方法,因为您正在定义如何管理查找,并且您不会因任何标签复杂性而混淆Foo对象。当然,如果每个Foo对象有8个标签,则必须存在8个相关的TagStore对象。
这似乎是简单标记Foo本身的明智选择吗?这太多开销了吗?
答案 0 :(得分:2)
我同意@Nick。
如果您使用重复属性作为标记,则5-8个标记已经足够有效。只是避免在一个属性/实体中存储100多个标签。 100,000个实体是可以的,因为数据存储区使用索引。
我已经在许多项目上使用过这种方法,并且没有任何问题。所以你很高兴。
答案 1 :(得分:1)
您描述的具体情况会很好。当您开始过滤或订购其他属性时,索引将开始失控。
例如,查找由创建日期升序排序的特定用户创建的所有foo将需要新索引,如果要降序,则需要另一个索引。
考虑您需要提供的基本搜索和排序排列 - 您应该假设每个排序都需要自己的索引。因此,如果只是通过一次订购进行搜索,那么您就可以了。
如果您希望用户切片和切块(即标准高级搜索UI),您应该考虑另一种选择。唯一可行的appengine托管解决方案是搜索服务和cloudsql。在此之后,您会在GCE或类似替代方案上查看托管弹性搜索等内容。