Google Cloud Datastore runQuery返回412“找不到匹配的索引”

时间:2013-07-02 16:58:30

标签: google-cloud-datastore

**更新**

感谢Alfred Fuller指出我需要为此查询创建一个手动索引。

不幸的是,从.NET应用程序使用JSON API,似乎没有官方支持的方法。实际上,从App Engine以外的应用程序来看,似乎没有正式的方法可以做到这一点,这很奇怪,因为Cloud Datastore API旨在允许访问App Engine以外的数据存储区。

我能找到的最接近的黑客是POST the index definition using RPChttp://appengine.google.com/api/datastore/index/add。有人可以给我一些关于如何准确执行此操作的原始规范(即URL参数,身体到底应该是什么样的等等),也许使用Fiddler来检查appcfg.cmd的调用?

**原始问题**

根据docs,“查询可以组合不同属性的等式(EQUAL)过滤器,以及单个属性上的一个或多个不等式过滤器”。

但是,此查询失败:

{
 "query": {
  "kinds": [
   {
    "name": "CodeProse.Pogo.Tests.TestPerson"
   }
  ],
  "filter": {
   "compositeFilter": {
    "operator": "and",
    "filters": [
     {
      "propertyFilter": {
       "operator": "equal",
       "property": {
        "name": "DepartmentCode"
       },
       "value": {
        "integerValue": "123"
       }
      }
     },
     {
      "propertyFilter": {
       "operator": "greaterThan",
       "property": {
        "name": "HourlyRate"
       },
       "value": {
        "doubleValue": 50
       }
      }
     },
     {
      "propertyFilter": {
       "operator": "lessThan",
       "property": {
        "name": "HourlyRate"
       },
       "value": {
        "doubleValue": 100
       }
      }
     }
    ]
   }
  }
 }
}

以下回复:

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "FAILED_PRECONDITION",
    "message": "no matching index found.",
    "locationType": "header",
    "location": "If-Match"
   }
  ],
  "code": 412,
  "message": "no matching index found."
 }
}

4 个答案:

答案 0 :(得分:6)

JSON API尚不支持本地索引生成,但我们已经记录了一个过程,您可以按照该过程生成https://developers.google.com/datastore/docs/tools/indexconfig#Datastore_Manual_index_configuration

索引的xml定义

请试一试,如果不起作用,请告诉我们。

这是一个临时解决方案,我们希望尽快替换自动本地索引生成。

答案 1 :(得分:2)

错误“找不到匹配的索引”。表示需要添加索引才能使查询生效。请参阅auto index generation documentation

在这种情况下,您需要一个具有属性DepartmentCode和HourlyRate的索引(按此顺序)。

答案 2 :(得分:1)

对于index.yaml我用这3个链接修复了它:

和最重要的链接:

如上一个链接所述,索引通过将查询的结果集存储在索引中来允许复杂查询更快地运行。当您获得order时,表示您尝试运行涉及filterindex.yaml的复杂查询。因此,为了使您的查询有效,您需要通过手动创建配置文件来定义您尝试运行的查询的索引,从而在google数据存储区索引上创建索引。以下是您的修复方法:

  1. 按照python conf文件的指令https://cloud.google.com/appengine/docs/python/config/indexconfig#Python_About_index_yaml在app域目录中以indexes命名的文件夹中创建gcloud-node文件,或者从{{1}获取灵感https://cloud.google.com/appengine/docs/python/config/indexconfig#Python_About_index_yaml
  2. 中的测试
  3. 使用以下命令从配置文件创建索引: gcloud preview datastore create-indexes indexes/index.yaml 请参阅https://github.com/GoogleCloudPlatform/gcloud-node/blob/master/system-test/data/index.yaml
  4. 等待索引在Cloud Datastore / Indexes中的开发者控制台上提供,界面应显示" serve"一旦建立了索引
  5. 一旦提供了您的查询就应该正常工作
  6. 例如,对于此查询:

     var q = ds.createQuery('project')
      .filter('tags =', category)
      .order('-date');
    

    index.yaml看起来像:

    indexes:
    
    - kind: project
      ancestor: no
      properties:
      - name: tags
      - name: date
        direction: desc
    

答案 3 :(得分:0)

尽量不要对结果进行排序。删除 orderby() 后,它对我有用。