Elasticsearch (バージョン 2.3.1) インデックスには、showDate
すべてのドキュメントのフィールドがあります。showDate
このフィールドには UNIX タイムスタンプが含まれており、過去 24 時間に が含まれているドキュメントの数とshowDate
、過去 7 日間にが含まれているドキュメントの数を調べたいと考えています。
私のJavaコードでは、これは私がこれを達成しようとした方法です:
public static final String TODAY = "today";
public static final String THIS_WEEK = "thisWeek";
protected static final int SECONDS_PER_DAY = (24 * 60 * 60);
//...
Date now = new Date();
double timestampNow = now.getTime() / 1000;
double timestampYesterday = timestampNow - SECONDS_PER_DAY;
double timestampThisWeek = timestampNow - (SECONDS_PER_DAY * 7);
AbstractAggregationBuilder aggregation = AggregationBuilders.range("time").field("showDate")
.addRange(TODAY, timestampYesterday, timestampNow)
.addRange(THIS_WEEK, timestampThisWeek, timestampNow);
searchRequestBuilder.addAggregation(aggregation);
この検索リクエストを実行して生成されたクエリを見ると、次のような結果が得られます
{
"from": 0,
"size": 15,
"query": {
...
}
"aggregations": {
"time": {
"range": {
"field": "showDate",
"ranges": [
{
"key": "today",
"from": 1.465369290E9,
"to": 1.465455690E9
},
{
"key": "thisWeek",
"from": 1.464850890E9,
"to": 1.465455690E9
}
]
}
}
}
}
KopfやHeadなどのプラグインでクエリを実行すると、期待どおりの結果が得られます。Java サービスで実行すると、docCount は常に 0 になります。
私が気づいた唯一の違いは、プラグインが double 値を long 値に変換することです。したがって、クエリを送信した後、1.465455690E9
数値は に変換され1465455690
ます。プラグインから得られるのと同じ結果を Java サービスで得る方法を知っている人はいますか?
更新 1 Dimitris の回答のおかげで、私のコードは次のようになります。しかし、それでも期待される結果は得られません。Head と Kopf が結果があることを通知しても、DocCount は常に 0 のままです。
Date now = new Date();
long timestampNow = now.getTime() / 1000;
long timestampYesterday = timestampNow - SECONDS_PER_DAY;
long timestampThisWeek = timestampNow - (SECONDS_PER_DAY * 7);
AbstractAggregationBuilder aggregation = AggregationBuilders.dateRange(KEY).field("showDate").format("epoch_second")
.addRange(TODAY, timestampYesterday, timestampNow)
.addRange(THIS_WEEK, timestampThisWeek, timestampNow);
更新 2: 私の最終的な解決策は次のようになります。
Date now = new Date();
long timestampNow = now.getTime() / 1000;
long timestampYesterday = timestampNow - SECONDS_PER_DAY;
long timestampThisWeek = timestampNow - (SECONDS_PER_DAY * 7);
AbstractAggregationBuilder aggregation = AggregationBuilders.dateRange(KEY).field("showDate").format("epoch_second")
.addRange(TODAY, String.valueOf(timestampYesterday), String.valueOf(timestampNow))
.addRange(THIS_WEEK, String.valueOf(timestampThisWeek), String.valueOf(timestampNow))
また、日付型になるようにインデックスを変更する必要showDate
がありました (形式はまだ epoch_second です)。