파이프라인 프로세서(pipeline processor)를 사용하면 특정 인덱스로 저장 또는 검색할 수 있다.
먼저 템플릿을 저장한다.
$ curl -X PUT "localhost:9200/_template/reglog?pretty" -H 'Content-Type: application/json' -d'
{
"template": "reqlog_*",
"mappings": {
"properties": {
"id": {
"type": "long"
},
"date1": {
"type": "date"
}
}
}
}
'
파이프라인을 등록한다. 파이프라인을 월별로 저장하기 위해 설정한 부분은 아래와 같다.
$ curl -X PUT "http://localhost:9200/_ingest/pipeline/reqlog-monthly-index" -H 'Content-Type: application/json' -d'
{
"description": "monthly index naming for reqlog",
"processors" : [
{
"date_index_name" : {
"field" : "date1",
"index_name_prefix" : "reqlog_",
"index_name_format" : "yyyy-MM",
"date_rounding" : "M"
}
}
]
}'
파이프에 템플릿을 저장하는 방식을 사용해 데이터를 인덱스에 저장한다.
$ curl -X PUT "localhost:9200/reqlog/_doc/2?pipeline=reqlog-monthly-index&pretty" -H 'Content-Type: application/json' -d'
{
"date1" : "2019-01-25T20:16:55.000Z"
}
'
데이터를 확인하면 제대로 있다. 이렇게 월별 인덱스에 저장한다.
$ curl http://localhost:9200/reqlog_2019-01/_doc/2
이렇게 다르게 저장해도 제대로 데이터를 검색할 수 있다.
$ curl -X PUT "localhost:9200/reqlog/_doc/4?pipeline=reqlog-monthly-index&pretty" -H 'Content-Type: application/json' -d'
{
"date1" : "2019-02-25T20:16:55.000Z"
}
'
$ curl http://localhost:9200/reqlog_2019-02/_doc/4
연도별 인덱스를 생성하려면 다음과 같이 파이프라인을 정의할 수 있다.
curl -X PUT "http://localhost:9200/_ingest/pipeline/reqlog_yearly_index" -H 'Content-Type: application/json' -d'
{
"description": "yearly index naming for reqlog_yearly",
"processors" : [
{
"date_index_name" : {
"field" : "date1",
"index_name_prefix" : "reqlog_yearly_",
"index_name_format" : "yyyy",
"date_rounding" : "y"
}
}
]
}'
그런데 문제는 UTC 기준으로 데이터를 인덱싱하지 못한다는 점이다.
timezone: +09:00을 사용하면 잘 동작한다.
$ curl -X PUT "http://localhost:9200/_ingest/pipeline/reqlog-monthly-index" -H 'Content-Type: application/json' -d'
{
"description": "monthly index naming for reqlog",
"processors" : [
{
"date_index_name" : {
"field" : "date1",
"index_name_prefix" : "reqlog_",
"index_name_format" : "yyyy-MM",
"date_rounding" : "M",
"timezone": "+09:00"
}
}
]
}'
만약 java timemillis 타입으로 데이터를 저장했다면
date_formats의 값을 [UNIX_MS]로 변경한다.
$ curl -X PUT "http://localhost:9200/_ingest/pipeline/reqlog-monthly-index" -H 'Content-Type: application/json' -d'
{
"description": "monthly index naming for reqlog",
"processors" : [
{
"date_index_name" : {
"field" : "date1",
"index_name_prefix" : "reqlog_",
"index_name_format" : "yyyy-MM",
"date_formats" : [ "UNIX_MS" ],
"date_rounding" : "M",
"timezone": "+09:00"
}
}
]
}'
참고 자료
https://github.com/elastic/elasticsearch/blob/7.4/modules/ingest-common/src/test/java/org/elasticsearch/ingest/common/DateIndexNameFactoryTests.java