반응형
Recent Posts
Recent Comments
관리 메뉴

개발잡부

[es8] Elasticsearch Timestamp Pipeline 본문

ElasticStack8/Elasticsearch

[es8] Elasticsearch Timestamp Pipeline

닉의네임 2022. 10. 2. 18:54
반응형

IP 와 location 정보를 색인하는데 .. 의미는 없지만 timestamp 를 찍어 보고 싶었다. 

_timestamp


Elasticsearch 초기 _timestamp에는 인덱스에 매핑 필드를 사용할 수 있었습니다. 이 기능은 버전 2.0부터 더 이상 사용되지 않지만, 그렇다고 해서 더 이상 타임스탬프가 있는 문서를 인덱싱할 수 없다는 의미는 아닙니다. Elasticsearch 타임스탬프는 여전히 가능하지만 생성하는 데 필요한 프로세스에는 약간의 노하우가 필요합니다. 이 기사에서는 Elasticsearch 타임스탬프를 생성하는 데 도움이 되는 단계별 지침을 제공합니다.

 

자 이렇다고 한다. 

_timestamp 필드는 더 이상 사용되지 않습니다.

버전 2.0부터 더 이상 사용 되지 않으므로 이 매핑 필드 유형을 사용하여 인덱스 문서에 대한 타임스탬프를 생성 하지 마십시오 .

 

"mappings" : {
"_default_" : {
"_timestamp" : { // 지원 중단됨
"enabled" : true ,
"store" : true
}
}
}

 

Elasticsearch v6.5 이상에서 타임스탬프 파이프라인 생성:

Elasticsearch 버전 6.5 이상을 실행하는 경우 index.default_pipeline설정을 사용하여 인덱스에 대한 타임스탬프 필드를 생성할 수 있습니다. 이는 Ingest API를 사용하고 인덱스가 생성될 때 파이프라인을 생성하여 수행할 수 있습니다. 아래 섹션에서 이 작업을 수행하는 방법을 보여 드리겠습니다.

참고: Elasticsearch 버전 5.2부터 수집 프로세서에서 생성된 "타임스탬프" 메타데이터 필드가 변경되었습니다. 현재 이 필드에는 util.Date유형 대신 Java 데이터 유형이 lang.String있습니다.

Ingest API를 사용하여 Elasticsearch 문서에 대한 타임스탬프 파이프라인 생성

파이프라인을 생성하여 Elasticsearch 타임스탬프 매핑 프로세스를 시작하겠습니다. 터미널 창이나 Kibana 콘솔 UI에서 cURL을 사용하여 Elasticsearch에 HTTP 요청을 만들어 pipeline. 이 파이프라인은 _ingestAPI를 사용하며 문서가 인덱싱될 때 타임스탬프를 생성하는 프로세서 역할을 합니다. 또한 모든 timestamp매핑 유형이 _ingest.timestamp데이터 유형을 갖도록 설정합니다.

 

curl -XPUT 'localhost:9200/_ingest/pipeline/timestamp' -H 'Content-Type: application/json' -d '
{
"description": "Creates a timestamp when a document is initially indexed",
"processors": [
{
"set": {
"field": "_source.timestamp",
"value": "{{_ingest.timestamp}}"
}
}
]
}
'
# _ingest.timestamp = YYYY-MM-DD'T'HH:mm:ssZ

 

다음은 Kibana 콘솔 UI에 대해 다시 형식화된 동일한 요청입니다.

 

위에 curl 명령어를 아래 kibana console 명령으로 자동으로 바꿔준다.

PUT /_ingest/pipeline/timestamp
{
  "description": "Creates a timestamp when a document is initially indexed",
  "processors": [
    {
      "set": {
        "field": "_source.timestamp",
        "value": "{{_ingest.timestamp}}"
      }
    }
  ]
}

 

 

실행 결과

 

Elasticsearch 인덱스의 타임스탬프 필드를 동적으로 매핑

문서에 대한 타임스탬프를 만드는 간단한 방법은 라는 매핑 유형 필드를 만드는 것입니다 "timestamp". 그러나 약간의 주의가 필요합니다. 인덱스 매핑에서 필드에 대해 명시적으로 설정할 때 데이터 유형을 신중하게 선택해야 합니다 "format". 그렇지 않으면 Elasticsearch가 문서의 에 할당된 데이터를 읽지 못할 수 있습니다 "timestamp".

 

 

"mappings" : {
"properties" : {
"timestamp" : {
"type" : "date" ,
"format" : "yyyy-MM-dd"
}
}
}
 
PUT test-timestamp
{
  "settings": {
    "number_of_replicas": 0,
    "number_of_shards": 1
  },
  "mappings": {
    "properties": {
      "timestamp": {
        "type": "date",
        "format": "yyyy-MM-dd"
      }
    }
  }
}

 

"timestamp"이 스크린샷에서 Elasticsearch 는 매핑 유형이 다음으로 명시적으로 설정되었기 때문에 필드에 대한 부동 데이터를 잘못 인덱싱합니다 "date".

 

지우고 다시 테스트 해보자

DELETE test-timestamp

PUT /_ingest/pipeline/timestamp
{
  "description": "Creates a timestamp when a document is initially indexed",
  "processors": [
    {
      "set": {
        "field": "_source.timestamp",
        "value": "{{_ingest.timestamp}}"
      }
    }
  ]
}



PUT test-timestamp1
{
  "settings": {
    "number_of_replicas": 0,
    "number_of_shards": 1
  },
  "mappings": {
    "properties": {
      "timestamp_t": {
        "type": "date",
        "format": "yyyy-MM-dd"
      }
    }
  }
}

PUT test-timestamp1
{
  "settings": {
    "number_of_replicas": 0,
    "number_of_shards": 1
  },
  "mappings": {
    "properties": {
      "timestamp_t": {
        "type": "date",
        "format": "strict_date_optional_time||epoch_millis"
      }
    }
  }
}


PUT test-timestamp/_doc/1?pipeline=timestamp
{
  "name":"bbongdoo"
}

GET test-timestamp/_search
{
  "query": {
    "match_all": {}
  }
}

 

 

 

 

날짜 타임스탬프로 매핑된 인덱스를 생성할 때 지정된 format 을 따라야 합니다. 날짜 형식이 암시적으로만 전달되면 다음과 같은 예외가 발생할 수 있습니다.

 

"failed to parse date field [1556892099.4830232] with format [strict_date_optional_time||epoch_mill
 

Float and integer epoch timestamps:

"date"이전 예제에서 새 타임스탬프 필드를 로 매핑하는 것이 작동하지 않는 것을 보았습니다 . 대부분의 경우 필드에 대한 매핑 type , 또는 대신 명시적으로 설정할 수 있습니다. 선택은 사용 중인 언어 또는 하위 수준 클라이언트와 생성된 타임스탬프 형식에 따라 달라집니다."timestamp""long""float""integer"

예를 들어, 메서드에 의해 호출되는 Python의 epoch 타임스탬프는 time.time()다음과 같은 float를 반환 1556892099.435682하지만 UNIX epoch 타임스탬프( date +%s) 및 PHP time()메서드는 다음과 같은 정수를 반환합니다 1556892474. 매핑을 설정하기 전에 미리 계획하고 타임스탬프 데이터가 실수 또는 정수로 표시되는 에포크 시간인지 또는 실제 날짜인지 여부를 결정해야 합니다.

내장 java.time데이터 유형 사용:

타임스탬프 필드에 적절한 날짜 형식을 사용하려는 경우 가장 호환되는 형식은 java.time라이브러리에서 생성된 값에서 찾을 수 있습니다. Elasticsearch는 Java를 기반으로 구축되고 실행되므로 모든 날짜 및 에포크 데이터 유형이 java.time형식을 따릅니다.

이에 대한 몇 가지 예에는 유효한 정수 또는 다음과 같은 "epoch_milli"사용자 정의 날짜 문자열 이 포함됩니다."format"

1
2
3
"YYYY-MM-DD'T'HH:mm:ssZ" ,
"dateOptionalTime" ,
"yyyy-MM-dd"

결론

Elasticsearch는 _timestamp더 이상 필드를 제공하지 않을 수 있지만 그렇다고 해서 Elasticsearch 타임스탬프를 직접 생성할 수 없는 것은 아닙니다. 문서에 대한 사용자 지정 Elasticsearch 타임스탬프를 생성하는 경우 성공의 열쇠는 인덱스가 타임스탬프 자체의 형식과 일치하도록 올바르게 매핑되었는지 확인하는 것입니다. 이 형식은 Elastisearch와 통신하기 위해 Python, PHP 또는 다른 환경을 사용하는지 여부에 따라 달라집니다. 이 문서에 제공된 지침을 사용하면 애플리케이션 요구 사항에 적합한 Elasticsearch 타임스탬프 매핑을 만드는 데 문제가 없습니다.

 
location 에 timestamp 적용
bulk(client, requests, pipeline='timestamp')

반응형

'ElasticStack8 > Elasticsearch' 카테고리의 다른 글

[es8] index 와 shard 사이즈  (0) 2022.10.06
[es8] Elasticsearch License  (0) 2022.10.03
[es8] geo-point  (0) 2022.09.26
[es8] korean analyzer-doori  (0) 2022.09.25
[es8] elasticsearch8.4.1 rest plugin for 900gle  (0) 2022.09.24
Comments