带有“Date = YYYY-MM-DD”的GAE Search API查询不返回任何结果

时间:2013-09-04 13:12:30

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

我正在尝试使用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 >= 2013-08-26 && date < 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-08-26之前返回3份文件。使用相等date = 2013-08-26运行时没有结果,但查询date >= 2013-08-26 && date < 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表示支持日期相等查询。

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

3 个答案:

答案 0 :(得分:1)

您使用搜索日期是正确的。这个区域存在漏洞,但它们已在1.8.4版本中得到修复。

有几点澄清:

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

  2. 查询中出现的日期(采用YYYY-MM-DD格式) UTC时区。这意味着有点微妙:

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

    同样,如果你在一天晚上9点坐在加利福尼亚, 它已经过了UTC的午夜......

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

答案 1 :(得分:0)

此问题已在SDK 1.8.4中得到解决。

请注意,升级到1.8.4会导致我的开发数据存储无效,因为Google可以根据需要执行此操作。一旦我在1.8.4数据存储区中重新创建数据,Search API就可以正确地进行相同的日期搜索。

答案 2 :(得分:-1)

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

可以有两种解决方案:

  1. 确保您未将年 - 月 - 日部分设置为零

  2. 按范围搜索:日期&gt; = currentDay&amp;&amp;日期&lt; nextDay