1

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
          }
        ]
      }
    }
  }
}

KopfHeadなどのプラグインでクエリを実行すると、期待どおりの結果が得られます。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 です)。

4

1 に答える 1

1

代わりに AggregationBuilders.dateRange を使用してください。

あなたの例では:

...
AbstractAggregationBuilder aggregation = AggregationBuilders.dateRange("time").field("showData").format("epoch_second")
                                                            .addRange(TODAY, (long) timestampYesterday, (long) timestampNow)
                                                            .addRange(THIS_WEEK, (long) timestampThisWeek, (long) timestampNow);

対応するelasticsearch組み込み形式の「epoch_second」の場合、日付が設定される形式を設定する必要があることに注意してください(https://www.elastic.co/guide/en/elasticsearch/reference/を参照) current/mapping-date-format.html#built-in-date-formats )

アップデート

タイムスタンプを文字列として渡す必要があることがわかりました。したがって、コードは次のようになります。

...
AbstractAggregationBuilder aggregation = AggregationBuilders.dateRange("time").field("showData").format("epoch_second")
                                                            .addRange(TODAY, String.valueOf(timestampYesterday), String.valueOf(timestampNow))
                                                            .addRange(THIS_WEEK, String.valueOf(timestampThisWeek), String.valueOf(timestampNow));
于 2016-06-09T10:59:22.280 に答える