매핑 파라미터
[Array 타입]
- array 타입 같은 건 없다.
- 기본적으로 엘라스틱서치에서는 어떤 필드라도 0개 이상의 값을 가질 수 있기 때문
- 따라서 array 타입이라고 지정하지 않아도 array 로 저장 가능
- 내부 구현
- 텍스트 필드인 경우, 토큰화 하고 역인덱스로 저장하게 된다.
- [“Strings are simply”, “merged together”] 은 사실 각 단어 단위로 저장된 하나의 문장처럼 저장되는 것과 같다
특징 - 모든 array 내부에는 같은 데이터형이 사용되어야 한다. (단 강제 변환-coercion이 가능한 경우는 가능)
ex) true, false, “true” -> 가능
- 다이나믹 매핑을 이용하는 경우는 강제 변환도 안됨.
- 형 변환에 의존하지 말자. (같은 형으로 저장하자..)
[Nested arrays]
- 배열 안의 배열도 가능하다. -> [1, [2, 3]]
- 이 경우 flatten 된 형태로 저장된다. -> [1, 2, 3]
- 독립적으로 Object를 쿼리해야 한다면 array에 대해서는 nested 데이터형을 사용해야 한다.
[매핑을 추가하는 방법]
PUT /reviews
{
"mappings": {
"properties": {
"rating": {"type": "float"},
"content": {"type": "text"},
"product_id": {"type": "integer"},
"author": {
"properties": {
"first_name": {"type": "text"},
"last_name": {"type": "text"},
"email": {"type": "keyword"}
}
}
}
}
}
- 정해진 네이밍 컨벤션은 따로 없다. 캐멀& 스네이크, 암거나 써라
- object를 매핑할 때 . 을 이용해서 좀 더 편하게 할 수 있다.
- properties 대신 “author.first_name” : {“type”: “text”}
[매핑 검색]
GET /reviews/_mapping/ -- 전체 매핑 조회
GET /reviews/_mapping/field/content -- 특정 필드 매핑 조회
GET /reviews/_mapping/field/author.email -- object 타입 내 특정 필드 매핑 조회
[이미 존재하는 인덱스에 필드 추가하기]
PUT /reviews/_mapping
{
"properties": {
"created_at": {
"type": "date"
}
}
}
[date 필드]
- 데이트 필드가 표현되는 세가지 방식
- 특별히 포맷된 문자열 형식
- 유닉스 시간 - epoch부터의 ms (Long)
- 유닉스 시간 - epoch부터의 초 (int)
- epoch = 1970년 1월 1일을 의미
- es가 지원하는 date 필드 포맷
- 시간 없이 날짜만
- 시간 포함 날짜 - 특정하지 않으면 타임존 UTC 시간으로 인식
- epoch로부터의 ms
- 날짜는 ISO 8601에 맞춰 포맷되어야 한다.
- 저장 시에는 유닉스 타임으로 저장된다.
- 타임존과 함께 저장한다면 저장할 땐 UTC 기준으로 저장한다.
- UTC 기준 시간이라면 “2015-01-29T11:23:41Z”
- 그 외 타임존이라면 “2015-01-29T11:23:41+01:00"
- Date 타입을 인덱싱할 때, 날짜형, 날짜+시간형, 유닉스 타임형을 다 섞어 써도 괜찮지만 유닉스 타임형 * 1000을 해줘야 한다는 걸 까먹으면.. 제대로 검색 안 된다.
- 필드 값이 없는 문서
- 엘라스틱 서치에서는 모든 필드가 optional 이다 (!= 관계형 DB)
- 쿼리할 때 해당 필드가 없는 문서는 제외하고 검색한다.
[매핑 파라미터]
- format
- date 필드를 커스텀할 때 사용 (하지만 커스텀하지 않기를 추천. 차라리 Logstash 같은 걸로 가공을 해라)
- properties
- object 타입을 매핑할 때 사용
- coerce
- 강제 형변환을 활성화 / 비활성화 하는데 사용 (기본값 = 활성)
- 필드마다 비활성화 할 수도 있고, 전체 인덱스에 대해서 비활성화할 수도 있다.
- 전체 인덱스에서 비활성화하고 특정 필드만 활성화하는 것도 가능
PUT /sales
{
"settings": {
"index.mapping.coerce": false // 전체 필드 coerce 비활성화
},
"mappings": {
...
}
}
- doc_values
- 루씬에서 사용하는 또 다른 자료구조
- 다른 데이터 접근 패턴에 대해서 최적화되어 있다. (document -> terms)
- 집계를 하고 싶거나 정렬을 하고 싶을 때 사용
- 정렬, 집계, 혹은 scripting 에 사용된다.
- 역인덱스의 대체가 아니라 추가적으로 사용되는 자료구조이다.
- 저장 공간 확보를 위해 doc_values를 false 로 설정할 수도 있다. (여러 데이터 구조로 저장하는 건 데이터 저장이 중복된다는 것이니까)
- 인덱싱 처리량도 살짝.. 올라간다
- 정렬 집게 같은 걸 안 한다면 false로 설정하라.
- 근데 이 값을 바꾸려면 새 인덱스로 모든 도큐먼트를 옮겨야 한다.
- 주로 어떤 쿼리를 하는지 분석을 해봐야 한다.
- norms
- 관계도 점수를 계산할 때 사용하는 여러 표준화 요인의 저장소를 말한다.
- 쿼리 시에 그냥 필터만 하는 게 아니라 (쿼리에 대해서 얼마나 잘 맞았는지) 순위를 매기고 싶을 때가 있다.
- Norms는 저장 공간을 많이 먹기 때문에 삭제하고 싶을 수 있다.
- 근데 삭제하면 이제 관계도 점수 측정 불가
- 필터링이나 집계는 그대로 가능
- index
- 필드 자체를 인덱싱 하지 않겠다는 옵션
- 해당 필드에 대해서 검색 쿼리가 불가능해진다
- 저장 공간 확보 + 인덱싱 처리량 상승
- 시계열 데이터(필터링에서는 사용하지 않고 집계 정도로만 사용하는 필드)에서 종종 사용된다 -> 집계는 가능
- null_value
- 엘라스틱 서치에서는 Null은 저장되지 않고 따라서 검색되지도 않는다.
- 이 옵션을 활성화하면 null 값을 다른 값으로 대체해준다.
- 빈 array같은 값에는 값 대체가 안 통한다.
- 대체하는 값은 정의된 필드의 값과 동일해야 한다.
- _source 에는 영향을 미치지 않아서 처음 들어온 값 그대로 노출되게 된다.
- copy_to
- 두 개 이상의 필드를 동시에 인덱싱하고 싶은 경우 사용 -> 값 복사
예 ) first_name + last_name -> full_name - 각 필드의 값이 복사된다 (term이나 토큰 복사가 아님)
- 대상 필드의 분석기가 복사된 값을 분석
- 복사된 필드는 _source에 포함되지 않음.
- 두 개 이상의 필드를 동시에 인덱싱하고 싶은 경우 사용 -> 값 복사
'TIL > 엘라스틱 서치' 카테고리의 다른 글
Elastic Search : Complete Guide to ElasticSearch - 매핑과 분석기에 대한 추천 (0) | 2024.02.04 |
---|---|
Elastic Search : Complete Guide to ElasticSearch - 리인덱싱 (0) | 2024.01.21 |
Elastic Search : Complete Guide to ElasticSearch - Mapping & Analysis (0) | 2024.01.17 |
Elastic Search : Complete Guide to ElasticSearch - Bulk API (0) | 2024.01.16 |
Elastic Search : Complete Guide to ElasticSearch - 낙관적 동시성 제어 (0) | 2024.01.14 |
댓글