Elasticsearch의 필드 유형은 어떻게 변경합니까?

Elasticsearch의 필드 유형은 어떻게 변경합니까?

2022-06-04 last update

6 minutes reading Elastic Search
맵 API를 사용하여 기존 필드를 업데이트하거나 기존 인덱스에 새 필드를 추가할 수 있습니다.
참고: 색인을 변경하려면 대상 색인에 대한 관리 권한이 있는지 확인합니다.

기본 용도


필드 유형을 수정하려면 매핑 API에 PUT 요청을 보내고 요청 본문을 보냅니다.요청 본문은 속성 매개 변수와 대상 필드의 맵을 포함합니다.새 필드를 만들 때 필드 이름, 유형 및 매핑 매개변수가 포함되어 있는지 확인합니다.
예를 들어 다음 요청은 필드 형식을integer에서long으로 변경합니다.
PUT /my-index/_mapping
{
"properties": {
"base_price": {
"type": "long"
}
}
}
성공적으로 완료되면 다음과 같은 출력을 볼 수 있습니다.
{
"acknowledged" :true
}

색인 방법


대부분의 경우, Elasticsearch는 기존 인덱스의 필드 형식을 업데이트하지 못하게 합니다.이렇게 하면 현재 데이터가 무효가 되고 색인에 오류가 발생할 수 있습니다.
기존 필드의 유형을 업데이트하려면 몇 가지 간단한 절차를 거쳐야 합니다.
  • 올바른 매핑 정보를 사용하여 새 인덱스를 만듭니다. 필드 형식이 필요한 형식으로 변경됩니다.
  • 데이터를 이전 인덱스에서 새 인덱스로 다시 인덱스합니다.
  • 이전 색인 삭제
  • 이 방법을 사용하면 인덱스의 최소 정지 시간을 줄일 수 있습니다.

    이전 색인 만들기


    필드 형식이 올바르지 않은 색인을 먼저 만듭니다.
    PUT /change-me
    {
    "mappings": {
    "properties": {
    "id": {
    "type": "integer"
    },
    "username": {
    "type": "text"
    }
    }
    }
    }
    위의 예시에서 우리는 두 개의 필드를 포함하는 간단한 인덱스가 있습니다. id와username입니다.필드 유형은 정수와 텍스트입니다.
    이 필드에 다음과 같은 쿼리와 같은 데이터가 포함되어 있다고 가정합니다.
    게시/변경/\u 문서
    {
    "id": 1000,
    "username": "root"
    }
    POST /change-me/_doc
    {
    "id": 1001,
    "username": "other"
    }
    위의 두 개의 조회는 요청 본문에서 제공한 데이터로 문서를 만들 것입니다.
    데이터 존재 확인:
    GET /change-me/_search?pretty
    {
    "query": {
    "match_all": {}
    }
    }
    우리는 다음과 같은 두 가지 기록을 보아야 한다.

    새 색인 만들기


    만약 우리가 id 필드를 정수에서 키워드로 바꾸려고 한다고 가정합니다.키워드 유형의 새 색인을 먼저 만들 것입니다.
    PUT /change-me-reindex
    {
    "mappings": {
    "properties": {
    "id": {
    "type": "keyword"
    },
    "username": {
    "type": "text"
    }
    }
    }
    }
    위의 요청에서 새 인덱스를 만들고 id 형식을 키워드로 설정합니다.

    이전 데이터 다시 인덱싱


    다음 단계는 색인 API를 사용하여 기존 색인에서 새 색인으로 데이터를 다시 색인합니다.요청은 다음과 같습니다.
    POST /_reindex
    {
    "source": {
    "index": "change-me"
    },
    "dest": {
    "index": "change-me-reindex"
    }
    }
    위의 요청은 문서를 이전 색인에서 새 색인으로 복사합니다. 필드 형식이 정수에서 키워드로 변경됩니다.
    위의 질의 출력:
    {
    "took" : 8,
    "timed_out" : false,
    "total" : 4,
    "updated" : 0,
    "created" : 4,
    "deleted" : 0,
    "batches" : 1,
    "version_conflicts" : 0,
    "noops" : 0,
    "retries" : {
    "bulk" : 0,
    "search" : 0
    },
    "throttled_millis" : 0,
    "requests_per_second" : -1.0,
    "throttled_until_millis" : 0,
    "failures" : [ ]
    }

    이전 색인 삭제


    현재 우리는 정확하게 비치는 업데이트 인덱스를 가지고 있습니다. 낡은 인덱스를 삭제할 때가 되었습니다.색인에 삭제 요청을 보내면 다음과 같이 작업을 수행할 수 있습니다.
    DELETE /change-me
    삭제에 성공하면 다음과 같은 출력을 볼 수 있습니다.
    {
    "acknowledged" :true
    }

    색인 별칭 만들기


    이전 인덱스를 사용하는 프로그램이 있으면 이미 존재하지 않기 때문에 작업을 멈출 수 있습니다.
    우리는 이 문제를 해결하기 위해 낡은 색인 이름을 사용하여 새 색인에 별명을 만들 수 있습니다.
    PUT /change-me-reindex/_alias/change-me
    상기 요청은 새 색인에 대한 별명을 만들어야 합니다.

    결론


    이 안내서에서는 Elasticsearch 인덱스의 기존 필드 유형을 변경하는 방법에 대해 설명합니다.