App Engine不会生成复合索引

时间:2014-08-22 10:43:46

标签: java google-app-engine

我正在关注Udacity开发可扩展的Java应用程序教程,我正在尝试通过多个属性创建查询,但它不起作用。

这是Api方法:

@ApiMethod(name = "filterPlayground",path = "filterPlayground",httpMethod = HttpMethod.POST)
public List<Conference> filterPlayground()
{
    Query<Conference>query = ofy().load().type(Conference.class).order("name");
    query.filter("city = ","London");
    query.filter("topics =", "Medical Innovations");
    query.filter("month = ", 6);

    return query.list();
}

以下是会议模型中的字段:

private static final String DEFAULT_CITY = "Default City";

@Index private List<String> topics;
@Index(IfNotDefault.class) private String city = DEFAULT_CITY;
@Index private int month;

它只显示所有会议。我不明白为什么这不起作用。顺便说一句,当我部署到localhost时,datastore-indexes-auto.xml始终为空。

这里是测试的链接: https://apis-explorer.appspot.com/apis-explorer/?base=https://deft-envoy-650.appspot.com/_ah/api#p/conference/v1/conference.filterPlayground?_h=3&

我希望有人可以帮助我。 的问候,

2 个答案:

答案 0 :(得分:2)

我也在研究相同的课程,并且在这一点上也很努力。无论我做什么,都没有创建datastore-indexes-auto.xml!

我的解决方法如下:

1)在以下文件夹中创建文件datastore-indexes.xml文件:/ conference / src / main / webapp / WEB-INF /:

<?xml version="1.0" encoding="UTF-8"?>
<datastore-indexes
autoGenerate="true">
    <datastore-index kind="Conference" ancestor="false">
        <property name="city" direction="asc" />
        <property name="topics" direction="asc" />
        <property name="month" direction="asc" />
        <property name="name" direction="asc" />
    </datastore-index>
</datastore-indexes>

(但是,autoGenerate =“true”似乎没有效果)

2)部署到appsot

这样您上面发布的查询就适合我。我同意 - 课程制定的GAE版本似乎有些不同,因为我遇到了几个问题(即我似乎没有本地数据存储区,但每个localhost执行都访问我的appspot数据存储区..)

答案 1 :(得分:1)

一些事情:

  1. 您使用的是简单(字段)索引。 Custom (or composite) index是其他内容,在您的情况下不需要,因为您只有相等过滤器。您的datastore-indexes-auto.xml为空,因为在您的情况下不需要复合索引。
  2. 在声明它们之后,每个实体保存/更新都会自动构建简单索引。因此,如果您已在数据库中拥有某些实体并且声明了新索引,则不会更新现有实体。
  3. 对于自定义索引,自动生成策略则相反:声明自定义索引后,DB将遍历所有现有实体并更新自定义索引。这可能需要一些时间,您可以在索引准备就绪时检查GAE管理控制台。