엘라스틱 서치에서 aggregations를 사용하여 text 필드를 그룹화 하려고 했다.

하지만 이런 오류와 함께 사용이 되질 않았다.

1
2
Fielddata is disabled on text fields by default. 
Set fielddata=true on [your_field_name] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory.
cs


그래서 엘라스틱 서치 문서를 살펴보던 중 text 필드에 fielddata에 대해 알게 되었다.

대 부분의 필드 들은 기본적으로 자신의 필드가 검색가능하도록 인덱스 처리가 된다. 그러기 위해서 대부분의  필드 들은 데이터 패턴을 사용하기 위해서 디스크에 doc_values를 index-time으로 사용할 수 있다하지만 text field doc_values 지원하지 않는다대신에 text 필드는 fielddata라고 불리는 in-memory 구조의 query-time 사용한다 데이터 구조는 필드가 집계정렬 또는 스크립트에 처음 사용될  필요에 따라 작성된다 fielddata 디스크의 각각의 세그먼트로 부터  색인을 읽어 결과를 JVM heap 메모리에 저장한다.

하지만 이 비용이 생각보다 크기 때문에 기본적으로 사용이 false로 되어 있다. 그렇지만 집계 기능을 사용하기 위해서는 해당 기능을 사용해야한다.

text field의 fielddata를 사용하는 방법


1. keyword 사용

기존에 사용하는 text 필드는 원래 기능 그대로 full text searches를 위해 사용하고, aggregations 기능을 사용하기 위해서 doc_values기능을 사용할 수 있는 keyword 필드를 추가한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
curl -X PUT "localhost:9200/my_index" -'Content-Type: application/json' -d'
{
  "mappings": {
    "_doc": {
      "properties": {
        "my_field": { 
          "type": "text",
          "fields": {
            "keyword": { 
              "type": "keyword"
            }
          }
        }
      }
    }
  }
}
cs


2. text field 기능 사용 시 fielddata 옵션 추가

1
2
3
4
5
6
7
8
9
PUT my_index/_mapping/_doc
{
  "properties": {
    "my_field": { 
      "type":     "text",
      "fielddata": true
    }
  }
}
cs


자세한 내용은 해당 링크 참조.
https://www.elastic.co/guide/en/elasticsearch/reference/current/fielddata.html

+ Recent posts