매핑 유형(mapping type)이 Elasticsearch에서 제거됨
67398 단어 Elasticsearch
참고: 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 인덱스에 저장할 수 있습니다.색인 사이는 완전히 독립적이며, 서로 다른 색인 중의 (동명의) 필드 형식도 충돌하지 않을 것이다.
이런 방식은 두 가지 장점이 있다.
모든 인덱스는 가능한 문서 메모리 등급에 따라 관련 설정을 설정할 수 있습니다: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
Elasticsearch 6.x
Elasticsearch 7.x
Elasticsearch 8.x
Elasticsearch 9.x
색인을 여러 유형에서 단일 유형으로 마이그레이션
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';
"""
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Embulk를 사용하여 ElasticCloud로 보내기Embulk에서 ElasticCloud에 보낼 수 있을까라고 생각비망록도 겸해 기술을 남깁니다 Embulk 설치 ElasticCloud (14 일 체험판) brew라면 아래 명령 입력 파일 만들기 파일 내용 seed...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.