ElasticSearch 강좌-fielddata 원리 초기 탐색
5522 단어 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를 바탕으로 한다면 성능이 매우 나빠질 것입니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
spring-data-elasticsearch 페이지 조회부록: 1. 이름에서 알 수 있듯이QueryBuilder는 검색 조건, 필터 조건을 구축하는 데 사용되고 SortBuilder는 정렬을 구축하는 데 사용된다. 예를 들어 우리는 어느 위치에서 100미터 범위 내의 모...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.