ElasticSearch 강좌-fielddata 원리 초기 탐색

5522 단어 ElasticSearch
ElasticSearch 요약 보기: ElasticSearch 강좌 요약
 
1. 박문kibana 플러그인 집합, 다이아몬드 분석, 집합 분석에서 kibana 플러그인 집합, 다이아몬드 분석, 집합 분석
GET /test_index/test_type/_search 
{
  "aggs": {
    "group_by_test_field": {
      "terms": {
        "field": "test_field"
      }
    }
  }
}
{
  "error": {
    "root_cause": [
      {
        "type": "illegal_argument_exception",
        "reason": "Fielddata is disabled on text fields by default. Set fielddata=true on [test_field] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory."
      }
    ],
    "type": "search_phase_execution_exception",
    "reason": "all shards failed",
    "phase": "query",
    "grouped": true,
    "failed_shards": [
      {
        "shard": 0,
        "index": "test_index",
        "node": "4onsTYVZTjGvIj9_spWz2w",
        "reason": {
          "type": "illegal_argument_exception",
          "reason": "Fielddata is disabled on text fields by default. Set fielddata=true on [test_field] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory."
        }
      }
    ],
    "caused_by": {
      "type": "illegal_argument_exception",
      "reason": "Fielddata is disabled on text fields by default. Set fielddata=true on [test_field] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory."
    }
  },
  "status": 400
}

단어의field에 대해 집합 작업을 직접 실행하면 오류가 발생할 수 있습니다. 아마도fielddata를 열고 정렬 인덱스 데이터를 메모리에 불러와야 단어의field에 집합 작업을 수행할 수 있고 많은 메모리를 소모할 수 있습니다.
 
2. 단어의field에 집합 작업을 수행하려면fielddata를true로 설정해야 합니다
POST /test_index/_mapping/test_type 
{
  "properties": {
    "test_field": {
      "type": "text",
      "fielddata": true
    }
  }
}
 
{
  "test_index": {
    "mappings": {
      "test_type": {
        "properties": {
          "test_field": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            },
            "fielddata": true
          }
        }
      }
    }
  }
}
GET /test_index/test_type/_search 
{
  "size": 0, 
  "aggs": {
    "group_by_test_field": {
      "terms": {
        "field": "test_field"
      }
    }
  }
}
 
{
  "took": 23,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 2,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "group_by_test_field": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "test",
          "doc_count": 2
        }
      ]
    }
  }
}

3. 내장field를 사용하여 단어를 구분하지 않고stringfield를 집합한다
단어를 구분하지 않는field에 집합 작업을 실행하면 바로 실행할 수 있습니다.fieldata=true (keyword는 256자 내에서 단어를 무시합니다)
GET /test_index/test_type/_search 
{
  "size": 0,
  "aggs": {
    "group_by_test_field": {
      "terms": {
        "field": "test_field.keyword"
      }
    }
  }
}
{
  "took": 3,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 2,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "group_by_test_field": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "test",
          "doc_count": 2
        }
      ]
    }
  }
}

4. 분사field+fielddata의 작업 원리
docvalue --> 단어를 구분하지 않는 모든 필드는 집합 작업을 수행할 수 있습니다. 즉, 필드가 단어를 구분하지 않으면 index-time (인덱스를 만들 때) 에서docvalue를 자동으로 생성합니다.이 단어가 구분되지 않는field에 대해 집합 작업을 실행할 때, 자동으로docvalue로 실행됩니다.
분사field,docvalue가 없습니다.index-time에서 특정field가 단어를 나누면 docvalue 정렬 인덱스를 만들지 않습니다. 단어를 나누면 공간을 너무 많이 차지하기 때문에 기본적으로 단어field가 집합되는 것을 지원하지 않습니다.
단어field는 기본적으로docvalue가 없기 때문에 단어field에 집합 작업을 직접 실행하면 오류가 발생합니다
단어field에 대해fielddata를 열고 사용해야 합니다. 순수한 메모리에 완전히 존재하고 구조는docvalue와 유사합니다.만약ngram이나 대량term이라면 반드시 대량의 메모리를 차지할 것이다.
만약에 단어의field에 집합을 실행해야 한다면fielddata=true를 실행해야 한다. 그리고es는 집합 작업을 실행할 때 현장에서 필드가 대응하는 데이터를 만들어fielddata 정렬 인덱스를 만들어야 한다. 필드data 정렬 인덱스의 구조는docvalue와 유사하지만,fielddata 정렬 인덱스를 메모리에 불러오는 것만 말하고 메모리에 있는fielddata 정렬 인덱스를 바탕으로 단어field의 집합 작업을 실행한다.
만약 분사field에 직접 집합을 실행하고 오류를 보고해야만 우리가fielddata=true를 열 수 있습니다. 우리는fielddatauninverted index를 인덱스로 정렬하고 메모리에 불러오면 메모리 공간이 소모된다고 알려 줍니다.
 
5. 왜 fielddata는 메모리에 있어야 합니까?
여러분 스스로 생각해 보세요. 단어를 나누는 문자열은term에 따라 집합해야 하고 더욱 복잡한 알고리즘과 조작을 실행해야 합니다. 만약에 디스크와oscache를 바탕으로 한다면 성능이 매우 나빠질 것입니다. 

좋은 웹페이지 즐겨찾기