매핑 유형(mapping type)이 Elasticsearch에서 제거됨

67398 단어 Elasticsearch
원문:https://www.elastic.co/guide/en/elasticsearch/reference/current/removal-of-types.html
참고: Elasticsearch6.0.0 또는 업데이트 버전에서 만든 인덱스는 맵 형식 (mapping type) 만 포함합니다.있다x에서 생성된 여러 맵 형식의 인덱스는 Elasticsearch6.x에서는 여전히 정상적으로 일할 것이다.Elasticsearch7.0.0에서는 매핑 유형이 완전히 제거됩니다.
맵 유형은 무엇입니까?
Elasticsearch의 첫 번째 발행판부터 모든 문서는 하나의 단독 인덱스에 저장되고 하나의 단독 맵 형식으로 배합됩니다.인덱스된 문서나 실체를 나타내는 맵 형식입니다. 예를 들어 트위터 인덱스는user 형식과 트위터 형식이 있을 수 있습니다.
매핑 형식마다 필드가 있기 때문에user 형식에full_name 필드, user_name 필드와 이메일 필드, 트위터 형식은 콘텐츠 필드, 트위터_를 포함할 수 있습니다at 필드, 그리고 사용자 형식과 유사한 user_name 필드.
문서마다 하나씩_type 메타 필드는 유형 이름을 저장하는 데 사용되며, URL에 유형 이름을 지정하여 하나 이상의 유형으로 검색할 수 있습니다.
GET twitter/user,tweet/_search
{
  "query": {
    "match": {
      "user_name": "kimchy"
    }
  }
}

_type 필드의 값은 문서의 _id 필드의 값을 조합하여 생성_uid 필드, 동일한_id의 서로 다른 유형의 여러 문서는 하나의 인덱스에 공존할 수 있습니다.
맵 형식도 문서 간의 부자 관계를 구축하는 데 사용된다. 예를 들어question 형식의 문서는answer 형식의 문서의 아버지가 될 수 있다.
맵 형식을 제거하는 이유 (mapping types)
처음에 우리는 색인(index)이 SQL 데이터베이스의 데이터베이스와 유사하다고 말했고, 유형(type)을 표와 동일시했다.
이것은 엉망진창이고 잘못된 가설을 초래했다.SQL 데이터베이스에서 테이블은 서로 독립적입니다.하나의 표의 각 열은 다른 표의 같은 이름의 열에 영향을 주지 않는다.맵핑 형식 (mapping type) 에서는 그렇지 않습니다.
같은 Elasticsearch 인덱스에서 서로 다른 맵 형식의 동명 필드는 내부에서 같은 Lucene 필드로 지원됩니다.다시 말하면 위의 예를 사용하면user 형식의user_name 필드와 트위터 형식의user_name 필드는 완전히 같고 두 user_name 필드는 두 가지 형식에서 같은 맵을 가져야 합니다.
이것은 어떤 경우에 혼란을 초래할 수 있습니다. 예를 들어 같은 색인에서 deleted 필드를date 형식으로 하고 다른 유형에서boolean 필드로 하고 싶습니다.
상기에서 한 가지 고려해야 할 것은 같은 색인에 저장된 각 실체가 매우 적거나 전혀 같은 필드가 없다면 이런 상황은 희소한 데이터를 초래하고 Lucene의 효율적인 데이터 압축 능력에 영향을 줄 수 있다.
이러한 이유로 맵 유형의 개념을 Elasticsearch에서 제거합니다.
매핑 유형에 대한 옵션 대안
문서 유형별 인덱스
첫 번째 선택은 모든 문서 형식이 색인에 대응하는 것이다.트위터와users를 같은 인덱스에 저장하지 않고 각각 트위터 인덱스와users 인덱스에 저장할 수 있습니다.색인 사이는 완전히 독립적이며, 서로 다른 색인 중의 (동명의) 필드 형식도 충돌하지 않을 것이다.
이런 방식은 두 가지 장점이 있다.
  • 데이터는 희소하지 않고 밀집하는 경향이 있다. 이렇게 하면 Lucene의 압축 기술에 이익을 얻을 수 있다
  • 같은 색인에 있는 모든 문서는 같은 실체를 대표하기 때문에 전체 텍스트 검색에 점수를 매기는 조건에 대한 통계가 더욱 정확합니다..

  • 모든 인덱스는 가능한 문서 메모리 등급에 따라 관련 설정을 설정할 수 있습니다:users에 대해 비교적 적은 메인 슬라이드를 사용할 수 있고 트위터에 비교적 많은 수의 메인 슬라이드를 사용할 수 있습니다.
    사용자 정의 유형 필드
    물론, 한 집단에서 만들 수 있는 메인 블록의 수량은 제한되어 있기 때문에, 수천 개의 문서만 집합하는 것을 위해 전체 블록을 낭비하고 싶지 않을 수도 있다.이 경우 자신이 정의한 type 필드를 사용할 수 있습니다. 원래의_type 작업 메커니즘이 유사합니다.
    우리는 위의user/tweet 예를 계속 사용합니다.기존 워크플로우는 다음과 같습니다.
    PUT twitter
    {
      "mappings": {
        "user": {
          "properties": {
            "name": { "type": "text" },
            "user_name": { "type": "keyword" },
            "email": { "type": "keyword" }
          }
        },
        "tweet": {
          "properties": {
            "content": { "type": "text" },
            "user_name": { "type": "keyword" },
            "tweeted_at": { "type": "date" }
          }
        }
      }
    }
    
    PUT twitter/user/kimchy
    {
      "name": "Shay Banon",
      "user_name": "kimchy",
      "email": "[email protected]"
    }
    
    PUT twitter/tweet/1
    {
      "user_name": "kimchy",
      "tweeted_at": "2017-10-24T09:00:00Z",
      "content": "Types are going away"
    }
    
    GET twitter/tweet/_search
    {
      "query": {
        "match": {
          "user_name": "kimchy"
        }
      }
    }

    사용자 정의 type 필드를 통해 같은 목적을 실현할 수 있습니다.
    PUT twitter
    {
      "mappings": {
        "doc": {
          "properties": {
            "type": { "type": "keyword" }, 
            "name": { "type": "text" },
            "user_name": { "type": "keyword" },
            "email": { "type": "keyword" },
            "content": { "type": "text" },
            "tweeted_at": { "type": "date" }
          }
        }
      }
    }
    
    PUT twitter/doc/user-kimchy
    {
      "type": "user", 
      "name": "Shay Banon",
      "user_name": "kimchy",
      "email": "[email protected]"
    }
    
    PUT twitter/doc/tweet-1
    {
      "type": "tweet", 
      "user_name": "kimchy",
      "tweeted_at": "2017-10-24T09:00:00Z",
      "content": "Types are going away"
    }
    
    GET twitter/_search
    {
      "query": {
        "bool": {
          "must": {
            "match": {
              "user_name": "kimchy"
            }
          },
          "filter": {
            "match": {
              "type": "tweet" 
            }
          }
        }
      }
    }

    매핑 유형이 없는 상태에서 부자 관계를 실현하다
    이전에, 우리는 하나의 맵 유형을 아버지로 지정하고, 다른 맵 유형을 자식으로 지정하여 부자 관계를 나타냈다.유형이 없는 상황에서 우리는 이런 문법을 사용할 수 없다.부자 관계의 특징은 이전처럼 작동할 것이다. 다른 점은 문서 간에 이러한 관계의 표현 방식이 새로운join 필드를 사용하는 것으로 바뀌었다는 것이다.
    맵 유형 제거 계획
    사용자에게 이것은 큰 변화이기 때문에 우리는 가능한 한 이 과정을 매끄럽게 한다.이번 변경 계획은 다음과 같습니다.
    Elasticsearch 5.6.0
  • 색인에 인덱스를 설정합니다.mapping.single_type:true는 단일 인덱스 - 단일 형식의 행동을 사용합니다. 이 행위는 6.0에서 강제적입니다..
  • 5.6에서 만든 인덱스는 문서 간의 부자 관계를 만드는 새로운join 필드를 사용할 수 있습니다

  • Elasticsearch 6.x
  • 5.x에서 만든 인덱스는 6.x에서 정상적으로 일합니다
  • 6.x에서 만든 인덱스는 단일 인덱스에 단일한 형식만 존재할 수 있습니다.임의의 이름은 유형으로 할 수 있지만 하나만.
  • _type 이름은 더 이상 _id 조합 생성_uid 필드._uid 필드는 단지_id 필드의 별명..
  • 새로 만든 인덱스는 더 이상 낡은 스타일의 부자 관계를 지원하지 않으며,join 필드를 사용해야 합니다..
  • _default_맵 유형이 권장되지 않는 것으로 표시됩니다

  • Elasticsearch 7.x
  • URL의 type 매개 변수는 선택 사항입니다.예를 들어, 문서를 색인하는 데 더 이상 문서 형식을 요구하지 않습니다..
  • GET|PUT_mapping API는 쿼리 문자열 매개 변수(include_type_name)를 지원하며, 이 매개 변수를 통해 요청체가 형식 이름을 포함해야 하는 층을 지정합니다.기본값은true입니다.7.x에 명시적으로 지정된 유형의 인덱스가 없으면 기본_doc 형식 이름..
  • _default_맵 유형 제거..

  • Elasticsearch 8.x
  • URL의 type 매개 변수는 더 이상 지원되지 않습니다..
  • include_type_name 매개 변수 기본값false..

  • Elasticsearch 9.x
  • include_type_name 매개 변수 제거..

  • 색인을 여러 유형에서 단일 유형으로 마이그레이션
    ReindexAPI를 사용하여 다중 유형 인덱스를 단일 유형 인덱스로 변환할 수 있습니다.다음 예는 Elasticsearch 5.6 또는 Elasticsearch 6.x에서 사용합니다.있다x에서 index를 지정할 필요가 없습니다.mapping.single_type, 왜냐하면x에서 기본적으로 켜져 있습니다.
    모든 문서 형식이 색인으로 바뀌다
    이 예는 우리의 트위터 인덱스를 트위터 인덱스와users 인덱스로 나눈다.
    PUT users
    {
      "settings": {
        "index.mapping.single_type": true
      },
      "mappings": {
        "user": {
          "properties": {
            "name": {
              "type": "text"
            },
            "user_name": {
              "type": "keyword"
            },
            "email": {
              "type": "keyword"
            }
          }
        }
      }
    }
    
    PUT tweets
    {
      "settings": {
        "index.mapping.single_type": true
      },
      "mappings": {
        "tweet": {
          "properties": {
            "content": {
              "type": "text"
            },
            "user_name": {
              "type": "keyword"
            },
            "tweeted_at": {
              "type": "date"
            }
          }
        }
      }
    }
    
    POST _reindex
    {
      "source": {
        "index": "twitter",
        "type": "user"
      },
      "dest": {
        "index": "users"
      }
    }
    
    POST _reindex
    {
      "source": {
        "index": "twitter",
        "type": "tweet"
      },
      "dest": {
        "index": "tweets"
      }
    }

    사용자 정의 유형 필드
    다음 예는 사용자 정의 type 필드를 추가하여 원래_로 설정합니다type 값입니다.동시에 유형을 _에 첨부id, 서로 다른 유형의 문서에 IDs가 충돌하지 않도록 합니다.
    PUT new_twitter
    {
      "mappings": {
        "doc": {
          "properties": {
            "type": {
              "type": "keyword"
            },
            "name": {
              "type": "text"
            },
            "user_name": {
              "type": "keyword"
            },
            "email": {
              "type": "keyword"
            },
            "content": {
              "type": "text"
            },
            "tweeted_at": {
              "type": "date"
            }
          }
        }
      }
    }
    
    
    POST _reindex
    {
      "source": {
        "index": "twitter"
      },
      "dest": {
        "index": "new_twitter"
      },
      "script": {
        "source": """
          ctx._source.type = ctx._type;
          ctx._id = ctx._type + '-' + ctx._id;
          ctx._type = 'doc';
        """
      }
    }

    좋은 웹페이지 즐겨찾기