엘라스틱 서치에서 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" -H '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
'데이터베이스 > Elasticsearch' 카테고리의 다른 글
Elasticsearch에서 Paging시 max_result_window 초과시 조회가 안되는 이슈 (0) | 2018.10.13 |
---|---|
Elasticsearch 6.4 기본 한글 형태소 분석기 노리 (nori) 설명 및 사전 추가하기 (0) | 2018.10.13 |
elasticsearch percolating 쿼리 (0) | 2018.10.06 |
elasticsearch 몇가지 간단 정리 (0) | 2018.10.06 |
elasticsearch session timeout 이슈 (0) | 2018.10.06 |