test1 인덱스에서 tags, persons 필드를 삭제하고자 할 때 

Elasticsearch 초보자라 제대로 한 건지는 모르겠지만 저는 아래와 같이 처리하였습니다.

 


1. 기존 인덱스의 데이타를 새 인덱스에 reindex

[root@localhost ~]# curl -XPOST "http://192.168.0.203:9200/_reindex?pretty" -H 'Content-Type: application/json' -d'
{
  "source": { "index": "test1" },
  "dest": { "index": "test-tmp" }
}'



2. 특정 필드들 삭제

[root@localhost ~]# curl -XPOST "http://192.168.0.203:9200/test-tmp/_update_by_query?pretty" -H 'Content-Type: application/json' -d'
{
  "script": {
    "inline": "ctx._source.remove(\"tags\");ctx._source.remove(\"persons\");",
    "lang": "painless"
  }
}'

/*
참고) 특정 조건에 부합하는 경우에만 삭제해주려면 아래와 같이 query를 만들어서 실행
[root@localhost ~]# curl -XPOST "http://192.168.0.203:9200/test-tmp/_update_by_query?pretty" -H 'Content-Type: application/json' -d'
{
  "script": {
    "inline": "ctx._source.remove(\"tags\")",
    "lang": "painless"
  },
  "query": {
    "bool": {
      "must": {
        "exists": {
          "field": "tags"
        }
      }
    }
  }
}'
*/



3. 삭제된 필드가 없는 인덱스 새로 생성

tags 필드를 remove했지만 test-tmp 인덱스 정보를 확인해보면 properties 항목에 tags 필드가 보여져서 아래와 같이 reindex를 한번 더 진행하였습니다.
더 좋은 방법이 있을 것 같지만, 지금 아는 지식 내에서는 이 방법밖에 생각이 나지 않아 reindex로 처리하였습니다.
[root@localhost ~]# curl -XPOST "http://192.168.0.203:9200/_reindex?pretty" -H 'Content-Type: application/json' -d'
{
  "source": { "index": "test-tmp" },
  "dest": { "index": "test2" }
}'

 

 

4. 불필요한 인덱스 삭제

[root@localhost ~]# curl -XDELETE "http://192.168.0.203:9200/test-tmp?pretty"

 

 

참고) tag 필드에 있는 데이타를 tags 필드에 넣고 tag 필드 삭제 

[root@localhost ~]# curl -XPOST "http://192.168.0.203:9200/test-tmp/_update_by_query?pretty" -H 'Content-Type: application/json' -d'
{
  "script": {
     "inline": "ctx._source.tags = ctx._source.tag; ctx._source.remove(\"tag\");",
     "lang": "painless"
  },
  "query": {
    "bool": {
      "must": {
        "exists": {
          "field": "tag"
        }
      }
    }
  }
}'

+ Recent posts