Page tree

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

[Removal of Types](https://www.elastic.co/guide/en/elasticsearch/reference/master/removal-of-types.html)

index 생성

...


document

...

Code Block
curl -X PUT "localhost:9200/twitter" -H 'Content-Type: application/json' -d'
{
    "settings" : {
        "index" : {
            "number_of_shards" : 3, 
            "number_of_replicas" : 2 
        }
    }
}
'
-- 성공
{"acknowledged":true,"shards_acknowledged":true,"index":"twitter"}
-- 실패 (동일 index 가 있는 경우)
{
  "error" : {
    "root_cause" : [
      {
        "type" : "resource_already_exists_exception",
        "reason" : "index [twitter/9ImsuIKGQUiqYgMh-Jm2Bw] already exists",
        "index_uuid" : "9ImsuIKGQUiqYgMh-Jm2Bw",
        "index" : "twitter"
      }
    ],
    "type" : "resource_already_exists_exception",
    "reason" : "index [twitter/9ImsuIKGQUiqYgMh-Jm2Bw] already exists",
    "index_uuid" : "9ImsuIKGQUiqYgMh-Jm2Bw",
    "index" : "twitter"
  },
  "status" : 400
}
  • number_of_shards: index를 작성하는 샤드 개수(각 샤드는 232개의 document 까지 저장 가능)
  • number_of_replicas: 복제 개수 (이 값은 1 이상으로 설정하는 것이 좋다)

동작 방식

  • primary node 에 처음 index를 생성하며, 클러스터의 모든 node에 그 상태를 전파한다.
  • 기본 매핑(빈 매핑)을 작성한다.
  • index에 필요한 모든 shard 를 초기화하고 데이터를 수신할 준비를 한다.

index name 제약

아스키 문자 [a-z], 숫자[0-9], 특수기호[., -, &, _]

index 삭제

index 삭제는 index shard, mapping, document 를 삭제한다. 삭제할 때는 관련된 모든 index가 디스크로부터 삭제되서 잃게되며 백업이 따로 없다면 복구할 수 없다. index 명 대신 _all 로 전체 index 를 삭제할 수 있다. 운영 환경에서는 action.destructive_requireds_name:true 로 변경하여 전체 index 삭제를 비활성화하는 것이 좋다.

Code Block
curl -X DELETE "localhost:9200/twitter"
-- 성공
{"acknowledged":true}
-- 실패 (index 가 없는 경우)
{
  "error" : {
    "root_cause" : [
      {
        "type" : "index_not_found_exception",
        "reason" : "no such index",
        "resource.type" : "index_or_alias",
        "resource.id" : "twitter",
        "index_uuid" : "_na_",
        "index" : "twitter"
      }
    ],
    "type" : "index_not_found_exception",
    "reason" : "no such index",
    "resource.type" : "index_or_alias",
    "resource.id" : "twitter",
    "index_uuid" : "_na_",
    "index" : "twitter"
  },
  "status" : 404
}

index 온/오프라인 변경

데이터를 유지하면서 자원(메모리/CPU)를 절약하려면 index 삭제 대신 닫아두는 것이 좋다. 엘라스틱서치는 index 를 열거나 닫아 온라인이나 오프라인모드로 설정할 수 있다.

Code Block
curl -X POST "localhost:9200/my_index/_close"
curl -X POST "localhost:9200/my_index/_open"

index 를 닫는 경우, 메타데이터 상태 변경을 제외하고 클러스터의 오버헤드가 없다. 또한 index shard 는 꺼지고 파일 디스크립터, 메모리, 스레드는 사용하지 않는다.

index 맵핑 정의

index 에 type mapping을 하는 방법으로 SQL로 치면 테이블 생성정도로 보면된다. index 의 유무를 확인하고 정의된 대로 한개 이상의 매핑을 만든다. 매핑을 위한 삭제 API 는 없다. 매핑을 삭제하거나 변경하려면 새로운 index 를 만들어서 전체레코드를 다시 색인해야한다. 엘라스틱서치에서는 속도향상을 위해 reindex 명령을 제공하고 있다.

Code Block
curl -X PUT "localhost:9200/twitter" -H 'Content-Type: application/json' -d'
{}
'
curl -X PUT "localhost:9200/twitter/_mapping/_doc" -H 'Content-Type: application/json' -d'
{
  "properties": {
    "email": {
      "type": "keyword"
    }
  }
}
'

index 생성에 _mapping 필드를 정의하면 생성과 함께 타입 매핑을 정의할 수 있다.

Code Block
curl -X PUT "localhost:9200/test" -H 'Content-Type: application/json' -d'
{
    "settings" : {
        "number_of_shards" : 1
    },
    "mappings" : {
        "_doc" : {
            "properties" : {
                "field1" : { "type" : "text" }
            }
        }
    }
}
'

타입매핑 참고

mapping 조회

index d에 정의된 매핑을 조회한다. 매핑을 클러스터 수준으로 저장한다. 조회 호출은 색인과 타입이 있는지 모두 확인하고 저장된 매핑을 반환한다.

Code Block
curl -X GET "localhost:9200/_mapping"
curl -X GET "localhost:9200/twitter/_mapping"
curl -X GET "localhost:9200/twitter/_doc/_mapping"

reindex

5.x 부터 추가된 기능이며, 하나의 index 에서 다른 index로 document를 복사한다. 아래 예제는 twitter 를 new_twitter 로 복사하는 예제이다.

Code Block
curl -X POST "localhost:9200/_reindex" -H 'Content-Type: application/json' -d'
{
  "source": {
    "index": "twitter"
  },
  "dest": {
    "index": "new_twitter"
  }
}
'
  • 원본 색인의 모든 문서에 대해 _source 를 활성화 해야 한다.
  • reindex 는 목적지 색인에 설정을 변경하지 않는다. Reindex 를 실행하기 전에 색인의 설정(매핑, 샤드 개수, 리플리카 등등)을 진행해야 한다.

?refresh

...

색인

...

Code Block
curl -X PUT "localhost:9200/test/_doc/1?refresh" -H 'Content-Type: application/json' -d'
{"test": "test"}
' 

엘라스틱서치는 파일 디스크립터를 닫았다가 다시 여는 데 필요한 과도한 I/O 로 인한 성능 저하 방지를 위해 문서를 입력할 때마다 매번 색인 상태를 새로 고치지는 않는다. 일반적으로 새로 고침을 호출하는 가장 적절한 때는 많은 데이터를 색인한 바로 다음이다.

document 색인

색인은 하나 이상의 문서를 색인에 저장하는 것을 의미한다. 관계형 데이터베이스에서 레코드를 추가하는 개념과 유사하다.

...

Code Block
curl -X POST "localhost:9200/_bulk" -H 'Content-Type: application/json' -d'
{ "index" : { "_index" : "test", "_type" : "_doc", "_id" : "1" } }
{ "field1" : "value1" }
{ "delete" : { "_index" : "test", "_type" : "_doc", "_id" : "2" } }
{ "create" : { "_index" : "test", "_type" : "_doc", "_id" : "3" } }
{ "field1" : "value3" }
{ "update" : {"_id" : "1", "_type" : "_doc", "_index" : "test"} }
{ "doc" : {"field2" : "value2"} }
'

index 생성

데이터를 색인하기 전에 첫 작업은 데이터의 주 컨테이너라고 할 수 있는 index 를 만드는 것 index 는 SQL의 데이터베이스 개념, type(table?) 과 document(record?)을 위한 컨테이너다

Code Block
curl -X PUT "localhost:9200/twitter" -H 'Content-Type: application/json' -d'
{
    "settings" : {
        "index" : {
            "number_of_shards" : 3, 
            "number_of_replicas" : 2 
        }
    }
}
'
-- 성공
{"acknowledged":true,"shards_acknowledged":true,"index":"twitter"}
-- 실패 (동일 index 가 있는 경우)
{
  "error" : {
    "root_cause" : [
      {
        "type" : "resource_already_exists_exception",
        "reason" : "index [twitter/9ImsuIKGQUiqYgMh-Jm2Bw] already exists",
        "index_uuid" : "9ImsuIKGQUiqYgMh-Jm2Bw",
        "index" : "twitter"
      }
    ],
    "type" : "resource_already_exists_exception",
    "reason" : "index [twitter/9ImsuIKGQUiqYgMh-Jm2Bw] already exists",
    "index_uuid" : "9ImsuIKGQUiqYgMh-Jm2Bw",
    "index" : "twitter"
  },
  "status" : 400
}
  • number_of_shards: index를 작성하는 샤드 개수(각 샤드는 232개의 document 까지 저장 가능)
  • number_of_replicas: 복제 개수 (이 값은 1 이상으로 설정하는 것이 좋다)

동작 방식

  • primary node 에 처음 index를 생성하며, 클러스터의 모든 node에 그 상태를 전파한다.
  • 기본 매핑(빈 매핑)을 작성한다.
  • index에 필요한 모든 shard 를 초기화하고 데이터를 수신할 준비를 한다.

index name 제약

아스키 문자 [a-z], 숫자[0-9], 특수기호[., -, &, _]

index 삭제

index 삭제는 index shard, mapping, document 를 삭제한다. 삭제할 때는 관련된 모든 index가 디스크로부터 삭제되서 잃게되며 백업이 따로 없다면 복구할 수 없다. index 명 대신 _all 로 전체 index 를 삭제할 수 있다. 운영 환경에서는 action.destructive_requireds_name:true 로 변경하여 전체 index 삭제를 비활성화하는 것이 좋다.

Code Block
curl -X DELETE "localhost:9200/twitter"
-- 성공
{"acknowledged":true}
-- 실패 (index 가 없는 경우)
{
  "error" : {
    "root_cause" : [
      {
        "type" : "index_not_found_exception",
        "reason" : "no such index",
        "resource.type" : "index_or_alias",
        "resource.id" : "twitter",
        "index_uuid" : "_na_",
        "index" : "twitter"
      }
    ],
    "type" : "index_not_found_exception",
    "reason" : "no such index",
    "resource.type" : "index_or_alias",
    "resource.id" : "twitter",
    "index_uuid" : "_na_",
    "index" : "twitter"
  },
  "status" : 404
}

index 온/오프라인 변경

데이터를 유지하면서 자원(메모리/CPU)를 절약하려면 index 삭제 대신 닫아두는 것이 좋다. 엘라스틱서치는 index 를 열거나 닫아 온라인이나 오프라인모드로 설정할 수 있다.

Code Block
curl -X POST "localhost:9200/my_index/_close"
curl -X POST "localhost:9200/my_index/_open"

index 를 닫는 경우, 메타데이터 상태 변경을 제외하고 클러스터의 오버헤드가 없다. 또한 index shard 는 꺼지고 파일 디스크립터, 메모리, 스레드는 사용하지 않는다.

index 맵핑 정의

index 에 type mapping을 하는 방법으로 SQL로 치면 테이블 생성정도로 보면된다. index 의 유무를 확인하고 정의된 대로 한개 이상의 매핑을 만든다. 매핑을 위한 삭제 API 는 없다. 매핑을 삭제하거나 변경하려면 새로운 index 를 만들어서 전체레코드를 다시 색인해야한다. 엘라스틱서치에서는 속도향상을 위해 reindex 명령을 제공하고 있다.

Code Block
curl -X PUT "localhost:9200/twitter" -H 'Content-Type: application/json' -d'
{}
'
curl -X PUT "localhost:9200/twitter/_mapping/_doc" -H 'Content-Type: application/json' -d'
{
  "properties": {
    "email": {
      "type": "keyword"
    }
  }
}
'

index 생성에 _mapping 필드를 정의하면 생성과 함께 타입 매핑을 정의할 수 있다.

Code Block
curl -X PUT "localhost:9200/test" -H 'Content-Type: application/json' -d'
{
    "settings" : {
        "number_of_shards" : 1
    },
    "mappings" : {
        "_doc" : {
            "properties" : {
                "field1" : { "type" : "text" }
            }
        }
    }
}
'

타입매핑 참고

mapping 조회

index d에 정의된 매핑을 조회한다. 매핑을 클러스터 수준으로 저장한다. 조회 호출은 색인과 타입이 있는지 모두 확인하고 저장된 매핑을 반환한다.

Code Block
curl -X GET "localhost:9200/_mapping"
curl -X GET "localhost:9200/twitter/_mapping"
curl -X GET "localhost:9200/twitter/_doc/_mapping"

reindex

5.x 부터 추가된 기능이며, 하나의 index 에서 다른 index로 document를 복사한다. 아래 예제는 twitter 를 new_twitter 로 복사하는 예제이다.

Code Block
curl -X POST "localhost:9200/_reindex" -H 'Content-Type: application/json' -d'
{
  "source": {
    "index": "twitter"
  },
  "dest": {
    "index": "new_twitter"
  }
}
'
  • 원본 색인의 모든 문서에 대해 _source 를 활성화 해야 한다.
  • reindex 는 목적지 색인에 설정을 변경하지 않는다. Reindex 를 실행하기 전에 색인의 설정(매핑, 샤드 개수, 리플리카 등등)을 진행해야 한다.

?refresh

엘라스틱서치는 색인 강제 새로고침을 사용해 검색자의 상태를 제어할 수 있다. 강제하지 않으면 최근 색인된 문서는 일정 시간(일반적으로 1초)이후에야 검색이 가능해 질 것이다.

Code Block
curl -X PUT "localhost:9200/test/_doc/1?refresh" -H 'Content-Type: application/json' -d'
{"test": "test"}
' 

엘라스틱서치는 파일 디스크립터를 닫았다가 다시 여는 데 필요한 과도한 I/O 로 인한 성능 저하 방지를 위해 문서를 입력할 때마다 매번 색인 상태를 새로 고치지는 않는다. 일반적으로 새로 고침을 호출하는 가장 적절한 때는 많은 데이터를 색인한 바로 다음이다.

타입 매핑
Anchor
타입 매핑
타입 매핑

  • 디스크의 색인 크기를 줄인다.(사용자 정의 필드를 위한 기능을 비활성화 한다.)
  • 관심 필드만 색인한다.(일반적인 속도 향상)
  • 빠른 검색이나 실시간 분석을 위한 패싯같은 선행처리한 데이터
  • 필드가 다중 토큰으로 분석돼야 하는지, 또는 단일 토큰으로 처리해야 하는지를 올바르게 정의

...