Elasticsearch doc_values

JunMyung Lee·2023년 2월 27일
0

Elasticsearch

목록 보기
9/37

doc_values?

역색인 구조를 사용하면 검색어를 고유한 정렬된 키워드 목록에서 검색할 수 있으며, 검색어를 목록에 즉시 접근할 수 있다.

dov_values는 문서 색인 단계에서 작성된 디스크 상의 데이터 구조 이며, 이를 통해 데이터 접근 패턴을 사용할 수 있다. _source와 동일한 값을 저장하지만 정렬 및 집계에서 훨씬 더 효율적인 컬럼 지향 방식으로 저장한다. doc_valuestext, annotated_text를 제외한 유형에서 지원된다.

doc_values의 쿼리 성능은 색인 구조에 비해 느리다. 하지만 Nested 구조에서의 자식들의 문서가 매우 많을 경우, 이때는 search를 수행하는 시간이 아닌, 자식들의 문서를 fetch를 수행하는 시간이 많아지게 된다.(즉, memory, cpu는 놀고 있는데 검색 속도가 느림)
이런 경우 doc_values를 통해 직접 접근하여 fetch를 수행한다면, 빠르게 검색을 수행할 수 있다.


Why do we use it?

참고 URL

Forward Index

Lucene의 기본원리는 역색인(Inverted index) 정보를 통해 검색을 한다.
정렬(Sort), 집계(Aggregation)필드 값에 대한 접근(Accessing field value) 같이 field value의 값만을 구하고자 한다면 역색인이 아닌 다른 데이터 접근 패턴이 필요하다.

fielddata

역색인 정보가 아닌 Document key로 field정보를 담는 데이터 구조. 키워드를 검색하고 문서를 찾는 대신, 문서를 검색하고 필드에 있는 검색어를 찾을 수 있어야 한다.

KeyValue
Doc1a:1,b:4,c:7
Doc2a:2,b:5,c:8
Doc3a:3,b:6,c:9

Fielddata의 경우, In-memory 구조로 동작하기 때문에 많은 Heap-memory를 소비하게 된다. (로딩시 segment의 life-cycle 동안 존재하게 됨 -> 높은 비용 발생)

이와 같은 이유로 Fielddata의 기본값은 false이며, 필요한 경우 fielddata=true로 옵션을 변경하여 사용이 가능하지만, memory사용에 주의가 필요하다

doc-values

fielddata의 In-memory 동작 구조를 개선한 디스크 저장 데이터 구조(on-disk data structure).
컬럼기반(column-oriented fasion)(Key, Value가 아님)으로 정렬, 집계에 유리하다

KeyDoc1Doc2Doc3
a123
b456
c789

keyword 자료유형은 단일 값이라 doc_values로 통계성 집계를 사용할 수 있는데 반해, text 자료유형은 analyzed된 토큰 기반이기 때문에 통계성 값으로는 사용하지 못한다. text 자료유형을 통계로 사용하기 위해서는 fielddata를 사용해야 하고, 메모리 점유율이 커지고 연산비용도 커진다. 해서 다중필드로 keyword를 추가하는 방식을 사용한다.

PUT my-index-000001
{
  "mappings": {
    "properties": {
      "status_code": { 
        "type":  "long"
      },
      "session_id": { 
        "type":  "long",
        "index": false
      },
      "category": { 
        "type":  "keyword",
        "doc_values": false
      }
    }
  }
}

PUT my-index-000001/_doc/1
{
  "status_code": 100,
  "session_id": 999,
  "category": "test"
}

GET my-index-000001/_search
{
  "docvalue_fields": ["status_code", "session_id"]
}

"hits": [
  {
	"_index": "my-index-000001",
	"_id": "1",
	"_score": 1,
	"_source": {
	  "status_code": 100,
	  "session_id": 999,
	  "category": "test"
	},
	"fields": {
	  "status_code": [
		100
	  ],
	  "session_id": [
		999
	  ]
	}
  }

GET my-index-000001/_search
{
  "docvalue_fields": ["category"]
}

"reason": {
          "type": "illegal_argument_exception",
          "reason": "Can't load fielddata on [category] because fielddata is unsupported on fields of type [keyword]. Use doc values instead."
}

0개의 댓글