0

Search API を使用して、Google App Engine で単純な Date クエリを実行しようとしています。私が達成しようとしているのは、特定の日付に等しいフィールドを持つすべてのドキュメントのリストを取得することだけです...

// 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 年 8 月 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 の精度でのみクエリ可能です (時間情報は、保存およびクエリ時に取り除かれます)。さらに、日付フィールドのクエリ ドキュメントには、日付等価クエリがサポートされていることが示されています。

誰かが問題が何であるかを理解するのを手伝ってくれませんか.

4

3 に答える 3

1

日付の検索の使用は正しいです。この部分にバグがありましたが、バージョン 1.8.4 で修正されました。

いくつかの明確化のポイント:

  1. 日付はミリ秒単位で保存されますが、インデックスは 1 日単位で作成されます。そのため、検索と並べ替えの目的で、時刻ではなく日付のみを取得します。しかし、取得したドキュメントを実際に調べると、すべての日付フィールドがミリ秒の精度に復元されます。

  2. クエリに表示される日付 (YYYY-MM-DD 形式) は、UTC タイム ゾーンであると見なされます。これの意味は少し微妙です。

    2013 年 9 月 10 日の午前 2 時にオーストラリアにいて、その時点の時刻のドキュメントを挿入するとします。グリニッジではまだ真夜中ではありません。日付はまだ 9 月 9 日です。日付でドキュメントを検索すると、[date=2013/09/09] では見つかりますが、[date=2013/09/10] では見つかりません。

    同様に、ある夜の午後 9 時にカリフォルニアにいる場合、UTC ではすでに真夜中を過ぎています ...

  3. 開発サーバーの管理コンソールにバグがあるようです。[全文検索] ページで、日付を含むドキュメント コンテンツを表示すると、日付は UTC ではなくローカル タイム ゾーンで表示されます。また、時間要素も含まれていません。

于 2013-09-04T17:06:29.737 に答える
0

この問題は SDK 1.8.4 で解決されています。

1.8.4 にアップグレードすると、開発データストアが無効になることに注意してください。これは、必要に応じて Google が許可されているためです。1.8.4 データストアのデータを再作成すると、検索 API は等価日付検索で正しく機能しました。

于 2013-09-10T13:04:15.573 に答える
-1

日付は、年月日の情報だけでなく、時、分、秒、ミリ秒で保存されているようです。

次の 2 つの解決策があります。

  1. 年月日の部分がゼロに設定されていないことを確認してください

  2. 範囲で検索: 日付 >= 現在の日 && 日付 < 次の日

于 2013-09-04T13:39:20.740 に答える