Запрос API поиска GAE с "Date = YYYY-MM-DD" не возвращает результатов

Я пытаюсь выполнить простой запрос Date в Google App Engine с помощью API поиска. Все, чего я пытаюсь добиться, - это получить список всех документов, у которых поле равно определенной дате...

// 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

Я ожидаю, что 3 документа будут возвращены на дату 2013-08-26. При беге с равенством 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);

В соответствии с документацией API поиска, поля Date сохраняются и могут запрашиваться только с точностью YYYY-MM-DD (информация о времени удаляется при хранении и запросе). Кроме того, документация " Запрос по полям даты" показывает, что запросы на равенство дат поддерживаются.

Может кто-нибудь, пожалуйста, помогите мне понять, в чем проблема.

3 ответа

Решение

Эта проблема была решена в SDK 1.8.4.

Обратите внимание, что обновление до 1.8.4 привело к тому, что мое хранилище данных разработки стало недействительным, как Google может делать, если это необходимо. После того, как я воссоздал данные в хранилище данных 1.8.4, API поиска работал правильно для поиска по дате.

Вы используете Поиск дат правильно. В этой области были ошибки, но они были исправлены в версии 1.8.4.

Пара разъяснений:

  1. Даты хранятся с разрешением в миллисекунды, но они индексируются с разрешением в один день. Итак, для целей поиска и сортировки у нас есть только дата, а не время суток. Но когда вы на самом деле исследуете извлеченный документ, любые поля даты будут восстановлены с точностью до миллисекунды.

  2. Даты, которые появляются в запросе (в форме ГГГГ-ММ-ДД), учитываются в часовом поясе UTC . Смысл этого немного тонок:

    Допустим, вы сидите в Австралии в 2:00 утра 2013/9/10 и решаете вставить документ с текущим временем. В Гринвиче еще не полночь; дата по-прежнему 9 сентября. Если вы ищете документ по дате, вы найдете его с [date=2013/09/09], но не с [date=2013/09/10].

    Точно так же, если вы сидите в Калифорнии в 21:00 однажды ночью, в UTC уже за полночь...

  3. Кажется, есть ошибка в консоли администратора сервера dev. Если на странице полнотекстового поиска отображается содержимое документа, содержащее дату, дата отображается в местном часовом поясе, а не в формате UTC . И это также не включает компонент времени.

Похоже, что ваша дата хранится не только с информацией год-месяц-день, но с часами, минутами, секундами и миллисекундами.

Там может быть два решения:

  1. Убедитесь, что вы установили не год-месяц-день часть на ноль

  2. Поиск по диапазону: дата>= текущий день && дата <следующий день

Другие вопросы по тегам