본문 바로가기
ELK/ElasticSearch

ElasticSearch _source / doc_value / stored_fields 3가지 차이점

by by 앵과장 2020. 5. 12.
반응형

 

 

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) 

라고 인지 하시면 개발하실때 도움이 되실꺼에요!

 

 

개발도움 (야오밍 검색개발자)