Google App Engine 搜索 API 日期字段排序中不包括时间

Google App Engine Search API Not Including Time in DateField Sort

我有一组搜索文档,其中有一个我想作为排序依据的 DateField。此字段中的值还包含时间。当我尝试按此字段降序排序时,我得到了正确排序的日期,但似乎时间被忽略了,即:

{
  "results": [
    {
      "photo_create_date": "2016-01-04T16:51:39.096000",
    },
    {
      "photo_create_date": "2016-01-04T17:55:36.483000",
    },
    {
      "photo_create_date": "2016-01-04T22:46:37.141000",
    },
    {
      "photo_create_date": "2016-01-04T16:51:13.450000",
    },
    {
      "photo_create_date": "2016-01-04T22:44:10.289000",
    },
    {
      "photo_create_date": "2016-01-04T22:36:28.252000",
    },
    {
      "photo_create_date": "2015-12-30T18:06:34.511000",
    }
  ]
}

知道如何解决这个问题吗?或者这是 GAE 搜索的限制 API?

看来,这似乎是我不得不推出自己的解决方案的错误。这是我使用的:

create_date_aware = pytz.utc.localize(item.create_date)
epoch_datetime = datetime.datetime(1970, 1, 1, tzinfo=pytz.utc)
create_timestamp = (create_date_aware - epoch_datetime).total_seconds()

您所要做的就是将此值存储为 NumberField,结果非常好。在弄清楚如何做到这一点时,这个问题有一些功劳:

python - datetime with timezone to epoch

这是我提交给 Google 的错误:

https://code.google.com/p/googleappengine/issues/detail?id=12650&thanks=12650&ts=1452021081

他们认为这是按预期工作的,所以我创建了一个功能请求:

https://code.google.com/p/googleappengine/issues/detail?id=12651&thanks=12651&ts=1452038680

这是documented behaviour

虽然看起来您已经有了解决方法,但您有几个选择:

  • 以数字形式存储自纪元以来的秒数
  • 自纪元以来以毫秒为单位存储数字,但是您需要至少除以 1000 才能适合搜索索引中可用的数字范围
  • 使用多个字段(日期、时间,可能还有时区)

如果您需要保留时区,则需要使用多字段方法,使用 seconds/millis 自纪元以来的规范形式进行比较。