【问题标题】:GAE Search API Query with "Date = YYYY-MM-DD" returns no results“日期 = YYYY-MM-DD”的 GAE 搜索 API 查询不返回任何结果
【发布时间】:2013-09-04 13:12:30
【问题描述】:

我正在尝试使用 Search API 在 Google App Engine 上执行简单的日期查询。我想要实现的只是获取字段等于某个日期的所有文档的列表...

// Prepare the Query
String searchString = "date = 2013-08-26";
Query query = Query.newBuilder().build(searchString);

// Get the Date_Search Index
IndexSpec indexSpec = IndexSpec.newBuilder().setName("Date_Search").build();
Index index = SearchServiceFactory.getSearchService().getIndex(indexSpec);

// Perform the search
Results<ScoredDocument> results = index.search(query);

当我运行上面的代码时,没有返回任何结果。但是,如果我将查询更改为 date &gt;= 2013-08-26 &amp;&amp; date &lt; 2013-08-27,则会返回预期结果。似乎日期相等逻辑不起作用。

这是我的索引中的文档列表...

DocId                                   OrderId     date        event_key
3d4e5691-8fb9-42de-bf09-f2303236f091    84288787    2013-08-25  641.0
7e4700fe-dee1-4579-87c5-69b1b1929f39    84288787    2013-08-25  650.0
8c9ca43d-7673-4f12-9f0b-e3328cbdaa85    84288787    2013-08-26  659.0
04fa8025-e01b-42d3-9bf9-21c3d9618ca7    84288787    2013-08-26  668.0
41465d1f-6d8a-431f-b226-141c8d72c064    84288787    2013-08-26  676.0
1ba01a6b-0890-43b3-8225-0ed196b6ee80    84288787    2013-08-27  676.0
a8ef18b1-ffa5-4823-8442-852f7142cad1    84288786    2013-08-25  633.0

我预计会在 2013 年 8 月 26 日返回 3 份文件。当使用相等 date = 2013-08-26 运行时,没有结果,但查询 date &gt;= 2013-08-26 &amp;&amp; date &lt; 2013-08-27 返回预期的 3 个结果。

使用以下代码将文档添加到索引中...

// Build the Date
Calendar calendar = Calendar.getInstance();
Date dateObject = calendar.getTime();

// Create the Document
Builder builder = Document.newBuilder();
builder.addField(Field.newBuilder().setName("event_key").setNumber(eventKey));
builder.addField(Field.newBuilder().setName("date").setDate(dateObject));
Document document = builder.build();

// Get the Date_Search Index
IndexSpec indexSpec = IndexSpec.newBuilder().setName("Date_Search").build();
Index index = SearchServiceFactory.getSearchService().getIndex(indexSpec);

// Store the Document
index.put(document);

根据Search API Documentation,日期字段被存储并且只能查询到 YYYY-MM-DD 精度(存储和查询时会去除时间信息)。此外,Query on Date Fields Documentation 表明支持日期相等查询。

有人可以帮助我了解问题所在。

【问题讨论】:

    标签: java google-app-engine gae-search


    【解决方案1】:

    您对日期搜索的使用是正确的。该区域存在错误,但已在 1.8.4 版本中修复。

    澄清几点:

    1. 日期以毫秒分辨率存储,但它们的索引为 一天的决议。因此,出于搜索和排序的目的 我们只有日期,没有时间。但是当你实际上 检查检索到的文档,任何日期字段都将 恢复到毫秒精度。

    2. 查询中出现的日期(以 YYYY-MM-DD 形式)在 UTC 时区。这句话的含义有点微妙:

      假设您在 2013 年 9 月 10 日凌晨 2:00 坐在澳大利亚,并且 您决定插入具有当时当前时间的文档。超过 格林威治还没有到午夜;日期仍然是 9 月 9 日。 如果您按日期搜索文档,您会找到它 [date=2013/09/09] 但不是 [date=2013/09/10]。

      同样,如果您在加利福尼亚的一晚晚上 9:00 坐在 UTC 时间已经过了午夜...

    3. 开发服务器管理控制台中似乎存在错误。在 全文搜索页面,如果您显示的文档内容 包含日期,日期以本地时区呈现 而不是UTC。而且它也不包括时间分量。

    【讨论】:

    • 感谢您的回复艾伦。我目前只在开发服务器上尝试过这个,因为我仍在完成生产代码的过程中。我正在运行最新的 SDK - 1.8.4 - 问题仍然存在。我已将此信息添加到问题 9353 和 8076,它们看起来都相似。
    【解决方案2】:

    此问题已在 SDK 1.8.4 中解决。

    请注意,升级到 1.8.4 会导致我的开发数据存储失效,如果需要,Google 可以这样做。在 1.8.4 数据存储中重新创建数据后,Search API 就可以正常工作以进行相等日期搜索。

    【讨论】:

      【解决方案3】:

      看起来您的日期不仅存储了年-月-日信息,还存储了小时、分钟、秒和毫秒。

      可以有两种解决方案:

      1. 确保您没有将年月日部分设置为零

      2. 按范围搜索:日期 >= currentDay && date

      【讨论】:

      • 根据 GAE Search API 文档,日期字段仅存储为 YYYY-MM-DD(没有任何时间信息)。
      • GAE 文档说,在存储文档时,时间信息已从日期字段中删除。此外,它表示日期查询支持相等性,并且只考虑 YYYY-MM-DD。请参阅我的问题中的文档链接(已更新)
      • 好吧,通过您的链接,我刚刚发现日期字段代表 java.util.Date 对象。您可能知道它有时间信息。
      • 还有一件事 - 这是搜索 API 的预览版。因此,与文档中的内容相比,它可以以其他方式工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-24
      • 2016-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多