ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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

    반응형

    댓글

Designed by Tistory.