Google App Engine错误:未找到匹配的索引。 (JAVA)

时间:2011-03-23 09:24:58

标签: java google-app-engine jdo

我正在编写查询,但它总是说“找不到匹配的索引”。我不知道为什么。我的代码如下:

Query query = pm.newQuery(Classified.class);
query.setFilter("emp_Id == emp");
query.setOrdering("upload_date desc");
query.declareParameters("String emp");
List<Classified> results = (List<Classified>)query.execute(session.getAttribute("emp_Id").toString()); 

<?xml version="1.0" encoding="utf-8"?>
<datastore-indexes autoGenerate="true">
  <datastore-index kind="Classified" ancestor="false">
    <property name="emp_Id" direction="asc" />
    <property name="category" direction="asc" />
    <property name="upload_date" direction="desc" />
  </datastore-index>
</datastore-indexes> 

我已添加上述索引,但没有帮助。

4 个答案:

答案 0 :(得分:6)

我认为您需要配置Datastore Index。可能已经在WEB-INF/appengine-generated/datastore-indexes-auto.xml的Eclipse中为您生成了一个,您只需将其复制到WEB-INF/datastore-indexes.xml并再次部署。

答案 1 :(得分:2)

因为这需要在互联网上的某个地方......

当我发现这一点时,我踢了自己 错误是您没有与查询要执行的索引匹配的索引。您可以为每个实体提供多个索引。

在Logcat错误中,它会告诉您确切要设置的索引以及元素需要的顺序。

即,如果错误说它想要(它不会很好地格式化):

<datastore-index kind="Classified" ancestor="false">
    <property name="category" direction="desc" />
    <property name="upload_date" direction="desc" />
  </datastore-index>

然后项目 - &gt;战争 - &gt; WEB-INF - &gt; appengine-generated - &gt; datastore-indexes-auto.xml并准确添加。然后,重新部署项目。

接下来进入您的Google云端控制台,查看数据存储区 - &gt;索引。应该说索引正在准备中(如果您可以终止所有连接的应用程序并关闭控制台中的实例,这会更快。)

一旦进入其他索引列表,请重新运行您的应用程序,它不会再出现关于索引的错误。

Go get it Gentlemen / Ladies

答案 2 :(得分:1)

您定义的索引必须按照返回的顺序保存所有可能的结果。您的查询要求输入由upload_date排序的特定emp_Id,但您的索引主要按类别排序。

尝试从索引定义中删除类别行,或交换categoryupload_date的顺序,使upload_date成为主要排序顺序指数。如果代码的另一部分依赖于类别行,则可能必须创建两个单独的索引(这会产生一些计算成本)。

编辑:请参阅Nick Johnson的评论。额外的参数。

答案 3 :(得分:0)

在执行单个属性查询时,我正在遇到此问题:

 const query = datastore
  .createQuery('Emailing_dev')
  .filter('status', '=', 'Scheduled')

就我而言,应该不会出现任何错误,但是会出现错误9:找不到匹配的索引。

如果我在yaml中两次定义了单个属性索引,它将起作用:

indexes:
  - kind: Emailing_dev
    properties:
    - name: status
    - name: status

但这肯定是一个错误.. !!