1

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 여전히) 타입 일입니다 그래서 내 인덱스를 변경했다.

답변

1

대신 AggregationBuilders.dateRange를 사용하십시오.

당신이 날짜는 귀하의 경우 해당 elasticsearch 내장 형식에 대한 "epoch_second"에 설정되는 형식을 설정해야
... 
AbstractAggregationBuilder aggregation = AggregationBuilders.dateRange("time").field("showData").format("epoch_second") 
                  .addRange(TODAY, (long) timestampYesterday, (long) timestampNow) 
                  .addRange(THIS_WEEK, (long) timestampThisWeek, (long) timestampNow); 

주 (참조 : 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)); 
+0

답장을 보내 주셔서 감사합니다. 내 코드를 업데이트 (위의 질문에 게시) 적어도 내가 기대하는 것과 비슷한 쿼리를 얻습니다. 슬프게도 docCount는 여전히 0입니다 ... 이유가 있습니까? – mvieghofer

+0

수동으로 검색을 구성하여 클러스터에 직접 게시 해 보셨습니까? "showData"가 날짜 필드로 매핑 되었습니까? –

+0

'searchRequestBuilder.toString()'을 사용하여 searchRequestBuilder를 콘솔에 씁니다. 여기에는 클러스터에 전송 된 쿼리가 포함됩니다. 이 쿼리를 복사하여 Head를 사용하여 클러스터로 보내면 예상 결과를 얻습니다 ('docCount! = 0'). Java 서비스에서 쿼리를 실행할 때'docCount'는 0입니다. – mvieghofer

관련 문제