【问题标题】:Missing index on specific entities in app engine应用引擎中特定实体的索引缺失
【发布时间】:2016-08-16 11:19:11
【问题描述】:

我在应用引擎中有实体,我查询为:

foo = Foo.all().filter('bar =', baz).get()
#baz is unicode, bar is a StringProperty
#Foo inherits from db.Model

这适用于大多数实体,但对于 baz 的某些值,即使该实体确实存在,也不会返回任何实体,这可以在 https://console.cloud.google.com/datastore/entities/ 进行验证,原因是对于 该特定实体 它的值bar 没有索引,该网页的“索引”列中没有复选标记就是证明。

docs 声明

自动创建简单查询的索引,例如对单个属性的查询

所以我预计该类型的 所有 实体都会在该属性上具有索引,但显然这是不正确的。问题:

Q1:创建索引时,是否将其添加到在第一次使用该索引运行查询之前放置的实体? (或者索引是在第一次放置该类型的任何实体时创建的?)

Q2:如果没有,实体的哪些更改(如果有)会导致索引被添加到该属性中? (我尝试更改 bar 和 put 以外的其他属性,但这并没有导致实体被添加)

Q3:在index.yaml 中明确列出索引会改变这种行为吗?

Q4:有没有办法以编程方式确定实体是否在特定属性上具有索引?

Q5:(奖励)上面是否有任何谷歌文档?

谢谢

【问题讨论】:

    标签: google-app-engine google-cloud-datastore google-cloud-platform


    【解决方案1】:

    Q1) 单个属性的索引是在您编写具有该属性的第一个实体时自动创建的(indexed=true)。但是,是否将属性添加到索引是您编写它时设置的实体/属性级别属性。

    Q2) 每个属性都有一个标志,告诉后端是否应该索引该属性。如果您读取实体并将其写回并在bar 上将标志设置为 true,它将被插入到索引。

    Q3) index.yaml 仅适用于复合索引(多属性索引)。当您编写/更新实体时,各个属性由属性级标志控制,不需要预先配置。

    Q4) 仅通过回读每个实体并检查相关属性的索引标志。

    Q5) 对于复合索引,您可以阅读Datastore Indexes。对于属性索引,请阅读“属性和值类型”部分的Entities, Properties, and Keys page - 您会在那里看到很多关于索引的信息。

    【讨论】:

    • 谢谢。自从提出这个问题后,我从谷歌工程师那里得到了一些反馈(通过电子邮件),并做了很多实验。我相信您对 Q4 的回答并不完全正确。 AFAICT,索引标志标记属性应该在放置时是否被索引,而不是它当前是否在索引中。例如,如果属性的类型以前是 TextProperty(不可索引),则放置了一些实体,然后将类型更改为 String,则该属性将不在索引中,但“索引”标志将为 True。听起来对吗?如果是这样,请您更新您的答案吗?
    • 为了确定哪些实体在索引中,我运行了一个类似Foo.all().order('bar') 的查询来确定哪些实体在索引中,并在每个实体上设置一个新属性,如has_index 为True。然后运行另一个查询,如Foo.all(),对于has_index 为 None 的每个实体,我可以推断出索引丢失,因此更改了bar 的值,然后放入。它奏效了,我找不到任何其他方法来做到这一点。因此,请您将其纳入您的答案,或提供代码或伪代码说明如何做到这一点,以便答案尽可能有用?谢谢
    【解决方案2】:

    您要存储的数据的长度是多少? Documentation 说:

    短字符串(最多 1500 字节)被编入索引,可用于查询过滤条件和排序顺序。

    长字符串(最多 1 兆字节)没有索引,不能用于查询过滤器和排序顺序。

    更多关于一般索引创建的信息here + 其“相关文章”。

    【讨论】:

    • 对于这个特定的实体,它是 9 个字符,utf-8。我认为那是 18 个字节。
    猜你喜欢
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-01
    相关资源
    最近更新 更多