2017-12-14 9 views
2

시간대가있는 날짜가 포함 된 elasticsearch의 데이터를 인덱싱하려고합니다.잘못된 날짜 오류 Elasticsearch에 데이터 인덱싱

내 날짜 매핑이다 : 나는 내 자신의 ZonedDateTime 어댑터를 만든

client.prepareIndex(INDEX, TYPE, id)) 
     .setSource(gson.toJson(object), XContentType.JSON) 
     .setRefreshPolicy(RefreshPolicy.IMMEDIATE) 
     .get(); 

다음과 같습니다 :

public class ZonedDateTimeAdapter implements JsonSerializer<ZonedDateTime> { 

    public JsonElement serialize(ZonedDateTime date, Type typeOfSrc, JsonSerializationContext context) { 
     DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); 
     return new JsonPrimitive(date.format(formatter)); 
    } 

} 
을 나는 인덱스에 다음 코드를 데이터를 사용

"date": { 
    "type": "date", 
    "format": "yyyy-MM-dd'T'HH:mm:ss.SSSZ" 
} 

결과 날짜는 2005-01-01T13:35:50.596-0500입니다. 어떤 내게 yyyy-MM-dd'T'HH:mm:ss.SSSZ 내 형식과 일치하는 것 같습니다. 그러나 나는라는 오류가 나타납니다 스레드에

예외를 "주"MapperParsingException의 [가 을 구문 분석하는 데 실패 [startDate를]]; 중첩 : IllegalArgumentException가 [잘못된 형식 : "2005-01-01T13 : 35 : 50.596-0500"가 "0.596-0500"에, 부정한다]

흥미로운 것은 내가 ZonedDateTimeAdapter의 형식을 변경하는 경우 yyyy-MM-dd'T'HH:mm:ss.000Z을 읽을 수 있다는 것입니다 (두 번째 분수는 항상 000이되어야 함) 결과는 2005-01-01T13:31:06.000-0500과 같습니다. 이 날짜의 개체는 elasticsearch에 성공적으로 인덱싱됩니다.

2005-01-01T13:31:06.000-0500 색인이 성공적으로 색인화되었지만 2005-01-01T13:35:50.596-0500이 아닌 이유를 알고 계십니까? 이 형식이 같은 형식이 아닌가요?

답변

2

업데이트 : ES 5.2에 대한 빠른 테스트를 수행했으며 정상적으로 작동했습니다.

$curl -XPUT localhost:9200/myindex1 -d ' 
{"mappings": {"type1": {"properties": {"field1": { 
    "type": "date", 
    "format": "yyyy-MM-dd'\''T'\''HH:mm:ss.SSSZ" 
}}}}} 
' 

$curl -XPUT localhost:9200/myindex1/type1/id1 -d ' 
    { "field1":"2005-01-01T13:35:50.000-0500" } 
' 

$curl -XPUT localhost:9200/myindex1/type1/id2 -d ' 
    { "field1":"2005-01-01T13:35:50.596-0500" } 
' 

우리가 같은 매핑을 확인하려면 :

$curl localhost:9200/myindex1/type1/_mapping 
{"myindex1":{"mappings":{"type1":{"properties": 
    {"field1":{"type":"date","format":"yyyy-MM-dd'T'HH:mm:ss.SSSZ"}}}}}} 

현재

this thread on https://discuss.elastic.co에서 Elasticsearch은 정밀도를 밀리 초이 GH issue을 볼 수 제한됩니다.

게시물은 2015 년이지만 문제는 공개되어 있습니다. 나노초 정밀도는 아직 지원되지 않는 것 같습니다.

+1

감사합니다. 0.001 밀리 초가 아닌가? .000000001은 나노초입니까? – Gabriel

+0

정말 옳은 소식입니다. 내 실수에 대한 사과 - 이전에이 문제에 직면 한 이후로 당신이 마이크로/나노초를하고 있다고 당연히 생각했습니다. 즉, 하나의 필드가있는 두 개의 문서를 삽입하여 모의 색인 (기본 매핑 사용)을 만들려고했습니다. 하나는 가치 '2005-01-01T13 : 31 : 06.000-0500'과 하나는'2005-01-01T13 : 31 : 06.596-0500'입니다. 둘 다 성공적으로 삽입되었습니다. 매핑이 문제를 일으키는 지 확인하십시오. – sam

+0

@Gabriel 내 로컬 ES에서 시도했다. 5.2 : 같은 매핑을 만들었고, 인덱스를 만들었으며, 그 값을 가진 두 개의 문서를 삽입했다. 모든 것이 잘 동작했다. 내 대답을 업데이트하여 로그를 반영했습니다. 간단한 컬 명령을 시도해 볼 수 있습니까? 문제를 ES 자체 또는 Java API로 격리 할 수 ​​있습니다. – sam

0

내 "수정"이이 문제를 보는 사람에게 적합한 지 확실하지 않습니다. 그러나 점점 더 악화되고있었습니다. 0에서 끝난 날짜를 파싱 할 수 없었습니다. 따라서 yyyy-MM-dd'T'HH:mm:00yyyy-MM-dd'T'HH:00은 실패하지만 yyyy-MM-dd'T'HH:mm:01 또는 yyyy-MM-dd'T'HH:01이 성공합니다. 내 전체 elasticsearch 데이터베이스를 파괴하고 6.1로 업그레이드하고 모든 데이터를 다시 인덱싱했습니다. 더 이상 문제가 보이지 않습니다.

관련 문제