파이프라인 프로세서(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

Posted by '김용환'
,