elasticsearch (버전 2.3.1) 색인에는 모든 문서에 대해 showDate
필드가 있습니다. 이 필드에는 유닉스 타임 스탬프가 포함되어 있으며 지난 24 시간 동안 showDate
의 문서 수와 지난 7 일 동안 showDate
의 문서 수를 확인하고 싶습니다. 내 자바 코드에서Unix 타임 스탬프를 통한 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
}
]
}
}
}
}
같은 것을 얻을 때 I Kopf 또는 Head과 같은 플러그인에서 쿼리를 실행하면 예상되는 결과가 나타납니다. 내 Java 서비스에서 그것을 실행할 때 docCount는 항상 0입니다.
유일한 차이점은 플러그인이 double 값을 long 값으로 변환한다는 것입니다. 그래서 쿼리를 보낸 후 1.465455690E9
숫자는 1465455690
으로 변환됩니다. 누구든지 내 플러그인에서 얻을 자바 서비스에서 동일한 결과를 어떻게 알 수 있습니까?
업데이트 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 여전히) 타입 일입니다 그래서 내 인덱스를 변경했다.
답장을 보내 주셔서 감사합니다. 내 코드를 업데이트 (위의 질문에 게시) 적어도 내가 기대하는 것과 비슷한 쿼리를 얻습니다. 슬프게도 docCount는 여전히 0입니다 ... 이유가 있습니까? – mvieghofer
수동으로 검색을 구성하여 클러스터에 직접 게시 해 보셨습니까? "showData"가 날짜 필드로 매핑 되었습니까? –
'searchRequestBuilder.toString()'을 사용하여 searchRequestBuilder를 콘솔에 씁니다. 여기에는 클러스터에 전송 된 쿼리가 포함됩니다. 이 쿼리를 복사하여 Head를 사용하여 클러스터로 보내면 예상 결과를 얻습니다 ('docCount! = 0'). Java 서비스에서 쿼리를 실행할 때'docCount'는 0입니다. – mvieghofer