PUT /movie
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 2
  },
  "mappings": {
    "_doc": {
      "properties": {
        "movieCd": {"type": "integer"},
        "movieNm": {"type": "text"},
        "movieNmEn": {"type": "text"},
        "prdtYear": {"type": "integer"},
        "openDt": {"type": "date"},
        "typeNm": {"type": "keyword"},
        "prdtStatNm": {"type": "keyword"},
        "nationAlt": {"type": "keyword"},
        "genreAlt": {"type": "keyword"},
        "repNationNm": {"type": "keyword"},
        "repGenreNm": {"type": "keyword"}
      }
    }
  }
}

책 보면서 따라하던 중.. 위처럼 인덱스를 생성하려고 하니

{
  "error" : {
    "root_cause" : [
      {
        "type" : "illegal_argument_exception",
        "reason" : "The mapping definition cannot be nested under a type [_doc] unless include_type_name is set to true."
      }
    ],
    "type" : "illegal_argument_exception",
    "reason" : "The mapping definition cannot be nested under a type [_doc] unless include_type_name is set to true."
  },
  "status" : 400
}

오류가 나옵니다.

오류를 자세히 읽어보면 매핑 정의들이 _doc 아래 중첩될 수 없다고 합니다.

이는 es 6.0 이하에서는 인덱스가 타입을 가질 수 있었는데 (예를 들어 영화 라고 하면 type에 액션, SF, 공포, ... 타입을 추가), 6.1부터는 인덱스당 하나의 타입만 사용할 수 있도록 바뀌었다고 합니다. 타입보단 각각 인덱스를 생성해 사용하라고 합니다.

아무튼 _doc은 의미없으니 지우면 됩니다

 

PUT /movie
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 2
  },
  "mappings": {
    "properties": {
      "movieCd": {"type": "integer"},
      "movieNm": {"type": "text"},
      "movieNmEn": {"type": "text"},
      "prdtYear": {"type": "integer"},
      "openDt": {"type": "date"},
      "typeNm": {"type": "keyword"},
      "prdtStatNm": {"type": "keyword"},
      "nationAlt": {"type": "keyword"},
      "genreAlt": {"type": "keyword"},
      "repNationNm": {"type": "keyword"},
      "repGenreNm": {"type": "keyword"}
    }
  }
}

프로퍼티 아래 바로 매핑정보를 작성해주면

 

{
  "acknowledged" : true,
  "shards_acknowledged" : true,
  "index" : "movie"
}

인덱스가 잘 생성됩니다

반응형