ElasticSearch 를 공부하다보니 모르는것 투성이라서 하나씩 궁금할때마다 정리 해보고자 합니다.
아래 2가지는 일부 필드만 결과로 반환하도록 하는 옵션 입니다.
일단 차이점이 뭔지 알아볼까요 ?
_source_stored_fields
기본적으로 검색 결과로 나온 원래의 json 데이터 모두는 _source 에 압축하여 담겨서 반환된다고 합니다.
이 때 _source=name,location 처럼 특정 필드를 지정하면 _source 에 담긴 데이터를 압축 해제한 다음 지정한 필드들만 뽑아서 반환합니다.
이 과정에서 수행되는 fetch & 압축해제는 매우 빠르게 수행된다고 합니다.
반면 stored_fields=name,location 처럼 지정된 경우, 지정한 필드가 stored 되어 있으면 (기본값: false), 이 필드들을 _source 로 부터 읽어오는 것이 아니라 색인된 값을 직접 읽어온다고 합니다.
(Lucene 의 코어 기능에 속함)
즉, 아래와 같이 구별하여 선택적으로 사용할 수 있다.
- 가져오고자 하는 필드가 많아서 stored_fields 로 일일히 가져오기에 부담 -> _source 에 지정하여 사용
- _source 에 담긴 데이터를 분석하는 코스트가 매우 높음 -> stored_fields 를 지정하여 사용
일반적으로는 _source 를 사용하는 것을 권장한다고 합니다.
doc_values
ES에서는 fielddata 와 doc_values 라는것이 있고 주요개념이므로 이해가 필요하다고 하네요
근본적으로는 루씬의 개념이기 때문에 storedField와 docValue 를 한번 찾아보겠습니다.
data를 mapping 할때 keyword type, text type 이 존재함
keyword type 경우 exact 매칭
text type 경우 analyzed 매칭
text type경우 형태소 분석을 통해 field 를 여러 terms 나눠역인덱싱 과정을 거치게 되고 keyword type은 역인덱싱 됩니다.
검색이라는것은 "어떤문서가 이키워드에 포함하는지를 찾아내기위함"
역색인(역인덱스) 정보를 통해 검색이 빠른것이며 루씬 기본원리 입니다.
sort, aggregation, accessing field value 같은 패턴은 이문서에서 이 field value 값이 무엇인지가 관심이므로 역인덱스 정보가 아닌 document key로 field 정보를 담은 데이터 구조가 필요합니다.
그데이터 구조가 fielddata 라는 것입니다.
key | value |
doc1 | a:1,b:4,c:7 |
doc2 | a:2,b:5,c:8 |
doc3 | a:3,b:6,c:9 |
그런데 fielddata 경우 in-memory 구조로 작동하기 때문에 많은 heap memory 를 소비하게된다고 하네요
filed 가 heap 에 로딩되면 그것은 segment 의 라이프싸이클 동안 남아 있게 됩니다.
따라서 높은 비용에 프로세스가 됩니다.
text field 를 사용하게 되면 fielddata 데이터 구조를 사용할수 있는데 위에 설명처럼 높은비용때문에 default 값은 false입니다.
필요한 경우 fielddata=true 옵션 변경하여 사용하면 빠른처리가 가능하지만 memory 사용에 주의 하시기 바랍니다.
keyword filed 에서는 fileddata 의 in-memory 동작 구조를 개선하여
on-disk data structure 인 doc_values 사용이 가능합니다.
doc_values 는 아래와같이 column-oriented fashion 으로 더욱 유리한 sort, aggregation 등을 할수 있다고 합니다.
key | doc1 | doc2 | doc3 |
a | 1 | 2 | 3 |
b | 4 | 5 | 6 |
c | 7 | 8 | 9 |
keyword type 과 text type은 이렇게 analyzed 차이 뿐아니라
fielddata, doc_value 와 같은 데이터 구조사용 여부도 달라지므로 적절한 data mapping 옵션설정이 중요합니다.
text 자료유형은 analyzed된 토큰 기반이기 떄문에 통계성 값으로 사용하지 못합니다.
일반 keyword 자료유형은 단일 값 이라, doc_value로 통계성 집계를 사용할 수 있는데, text는 doc_value를 사용하지 못해서 fielddata
를 사용하는데 메모리 점유율이 높고 연산비용이 커집니다.
역색인구조는 analyzed된 값과 doc_id 기준 매핑 관계 구조이며
정방향 색인 구조는 통계성 집계를 하기 위한 저장 데이터 구조 입니다.
저장할때 doc_vlaue or field_data 둘중 하나를 사용하시면됩니다.
doc_value(keyword),
field_data(text)
라고 인지 하시면 개발하실때 도움이 되실꺼에요!
개발도움 (야오밍 검색개발자)
'ELK > ElasticSearch' 카테고리의 다른 글
엘라스틱서치(Elasticsearch),Logstash,Kibana 6.5.4 버전 Redis Server Client 설치 입문 시작하기 1편 (2) | 2020.06.29 |
---|---|
ElasticSearch SendMail 발송 batch 용도 Scroll API 구현하기 (0) | 2020.05.13 |
ElasticSearch Query context vs Filter context 차이점 (0) | 2020.05.13 |
ElasticSearch Aggregations aggs composite afterkey Spring 집계 활용방법 (4) | 2020.05.12 |
ElasticSearch kibana DevTool Springboot Java 사용방법 (0) | 2020.04.29 |