【问题标题】:Google App Engine Error: No matching index found. (Java)Google App Engine 错误:未找到匹配的索引。 (爪哇)
【发布时间】:2011-07-21 03:48:36
【问题描述】:

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

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> 

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

【问题讨论】:

    标签: java google-app-engine jdo


    【解决方案1】:

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

    【讨论】:

    • 对于上述查询或表,您可以定义如何创建数据存储索引
    • datastore-indexes> 我在上面添加了但没有帮助..你能帮帮我吗..
    • 数据存储索引>
    【解决方案2】:

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

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

    编辑:请参阅下面尼克约翰逊的评论。额外的参数。

    【讨论】:

    • 交换两者没有帮助 - App Engine 无法使用其中包含查询中未使用的额外属性的索引。
    【解决方案3】:

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

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

    在 Logcat 中,error 会准确告诉你要设置什么索引以及元素需要的顺序。

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

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

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

    接下来进入您的 Google Cloud Console 并查看 Datastore -> 索引。它应该说正在准备索引(如果您可以杀死所有连接的应用程序并在控制台中关闭实例,这会更快)。

    一旦它移动到其他索引列表中,重新运行您的应用程序,它就不会再出现关于索引的错误。

    先生们/女士们去拿吧

    【讨论】:

    【解决方案4】:

    我在进行单个属性查询时遇到了这个问题,例如:

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

    在我的情况下,我不应该收到任何错误,但是我收到错误 9:未找到匹配的索引。

    如果我在 yaml 中定义了两次单一属性索引,它可以工作:

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

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

    【讨论】:

      猜你喜欢
      • 2015-06-30
      • 1970-01-01
      • 2019-01-19
      • 2010-12-07
      • 1970-01-01
      • 2011-03-03
      • 1970-01-01
      • 2020-08-16
      • 1970-01-01
      相关资源
      最近更新 更多