【问题标题】:PHP-GDS Sort queries from AppEngine DataStore来自 AppEngine DataStore 的 PHP-GDS 排序查询
【发布时间】:2015-02-26 13:01:37
【问题描述】:

我使用很棒的PHP-GDS 使用架构创建了一个索引:

$obj_product_schema = (new Schema('Product'))
   ->addString('url')
   ->addString('date')
   ->addString('name', TRUE)
   ->addInteger('votes', TRUE);

但是,如果我尝试使用如下排序查询返回对象子集,则会收到“未找到匹配索引”错误。

$queryStr = "SELECT * FROM Product WHERE date='" . $dateQ . '" ORDER BY votes ASC ";
$obj_event_store->query($queryStr); 
$products = $obj_event_store->fetchPage(5);

错误:

Fatal error: Uncaught exception 'Google_Service_Exception' with message 'Error calling POST https://www.googleapis.com/datastore/v1beta2/datasets/app/runQuery: (412) no matching index found.'

【问题讨论】:

  • stackoverflow.com/questions/28424157/… 你也有同样的问题 ;) 先在 devserver 中运行,然后上传 :)。您显示的不是索引,而是您的架构。
  • 对不起帕特里斯,但请阅读问题。检索数据时查询工作正常,例如 '"SELECT * FROM Product WHERE date='" 。 $日期Q 。 '" 有效,但是当附加 'ORDER BY' 时,查询失败并出现“未找到匹配索引”错误。
  • 您的 order by 也会影响所需的索引,因此您很可能有一个日期索引,但没有一个用于“日期+投票”的索引。在进一步调查之前,我会坚持我的第一件事;)。也可以在这里发布您的 datastore-index.yaml 吗?

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


【解决方案1】:

当您在参数上加上“true”时,它确实为该单个参数创建了一个索引。我认为混淆是在单参数索引和复合索引之间(我刚刚看到你的 other question 由汤姆回答)。

虽然这些单参数索引确实适用于单参数查询(SELECT * FROM X WHERE Y = whatever,它只需要 Y 的索引),但当您在不同的参数上添加 order by 时,它需要一个复合索引 (SELECT * FROM X WHERE Y = whatever ORDER BY Z,它需要 Y 和 Z)。您不能直接在架构中声明它们,它们需要与您的应用程序一起上传(在一个名为 index.yaml 的文件中)。

这样想:您的数据存储当前有一个索引,其中 only 可用的信息是日期和对象的键。它还有另一个索引,其中 only 可用信息是投票和对象的键。如果你要求一个有投票命令的日期,它怎么知道要返回什么?这就是为什么您需要添加一个索引,其中可用的信息是日期投票,以及对象的键,以便您的数据存储可以查找该表

附带说明:系统比以前变得更好了:它现在可以使用 ZigZag 合并算法从更简单的索引中生成更复杂的索引(尽管这方面仍然存在限制,显然,性能会受到影响)。

related answer中的更多信息

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-07
    • 2015-05-11
    • 1970-01-01
    • 2016-11-30
    • 1970-01-01
    • 2018-03-17
    • 1970-01-01
    相关资源
    最近更新 更多