-
elasticsearch(with lucene) field_data에 대해서 알아보자elasticsearch 2021. 2. 9. 11:04반응형
예전에 무신사 es 서비스 성능 튜닝을 하기 위해 여러가지 점검을 하였는데 그 중 fielddata, doc_value, eager_global_ordinals에 정리해보려고 한다 doc_value와 eager_global_ordinals은 다음에 작성할 예정이며 오늘은 field_data에 정리해보려고 한다
루씬을 내부적으로 데이터를 역색인하여 저장하고 특정 query에 대해 관련 있는 문서를 얻기 위해서 만들어졌다
그런데 단순 질의뿐만 아니라 집계나 필드 기준으로 정렬하는 것에 대한 요구사항이 있었고 이런 요구사항을 해결하기위해 루씬은 역색인 된 데이터를 univerted하여 컬럼 중심 뷰를 만들게되었다검색시점이나, close한 인덱스를 다시 open 하거나 할 때 등등 univerted(이것 또한 비용이 꽤나 듬)하여 메모리에 로딩한다
text type에서 aggregation, sorting, scripting에 사용하기 위해서 field_data를 사용하고
기본적으로는 disable 되어있으며 사용하기 위해선 fielddata: true를 셋팅 해줘야한다
field data를 사용하는 text type은 분석된 채로 heap 메모리에 로딩된다
예를 들면 New York을 standard로 tokenizer로 분석해서 색인 되었다면 New, York으로 분석되고
각각 field data로 로딩된다 물론 분석되지 않도록 해서 New York으로 색인 할 수도 있지만 heap 메모리를 사용한다는 점에 있어서 field data를 사용하는 것을 권장하지 않는다
또한 heap에 올라가게 되다보니 gc를 사용하게 되는데 그것 또한 문제가 될 수 있고 클러스터 퍼포먼스 이슈가 발생할 수 있게 된다
위와 같은 heap 메모리 증가 gc 등의 단점으로인해 2012년 말 루씬 4.0에서 doc_values가 나왔고 es에서는 keyword type으로 doc_value를 사용하기를 권장한다PUT my-index-0000011 { "settings": { "analysis": { "analyzer": { "std_folded": { "type": "custom", "tokenizer": "standard", "filter": [ "lowercase", "asciifolding" ] } } } }, "mappings": { "properties": { "text": { "type": "text", "analyzer": "std_folded" , "fielddata": true } } } } POST my-index-0000011/_doc/1 { "text": "천천히 올라가자", "keyword": "천천히 올라가자" } POST my-index-0000011/_doc/2 { "text": "올라가자 천천히", "keyword": "올라가자 천천히" } POST my-index-0000011/_search { "aggs": { "test": { "value_count": { "field": "text" } } } } POST my-index-0000011/_doc/13 { "text": "1 2 3 4 5", "keyword": "1 2 3 4 5" } POST my-index-0000011/_doc/14 { "text": "2 3 4", "keyword": "2 3 4" } POST my-index-0000011/_doc/14 { "text": "6 7 8", "keyword": "6 7 8" } POST my-index-0000011/_doc/15 { "text": "8 7 6 9 10", "keyword": "8 7 6 9 10" } GET my-index-0000011/_search { "sort": [ { "text": { "order": "desc" } } ], "_source": "text", "size": 20 } DELETE my-index-0000011 { }
집계의 경우 예상이 너무 되어 설명 생략하겠다
정렬의 경우에 내림차순에는 분석된 데이터 중에서 정렬 된 데이터 중 가장 마지막에 있는 데이터를 기준으로 정렬하고 오름차순일 경우에는 분석된 데이터 중 첫번째 데이터를 기준으로 정렬한다 예를들면 문서 1번의 text 값을 1 2 3 4의 데이터를 standard 분석기를 통해 분석을 한다면 1, 2, 3, 4로 분석되는데 오름차순일 때는 1을 사용해서 정렬되고 내림차순일 경우에는 4를 사용해서 내림차순을 한다
es 공식홈페이지의 영문을 번역하고 요약하였습니다.
https://www.elastic.co/guide/en/elasticsearch/reference/7.10/text.html#fielddata-mapping-param
반응형'elasticsearch' 카테고리의 다른 글
elasticsearch function_score (0) 2021.02.22 elasticseaarch eager global ordinal를 사용해 퍼포먼스를 올려보자 (0) 2021.02.20 elasticsearch similarity module 이용해서 score 수정하기 (0) 2021.02.15 세그먼트의 불변성 - 장점 (0) 2021.02.12 elasticsearch aggregation(aggs) paging 하기 (0) 2020.05.07