검색 방식
from 방식
GET my_index/_search
{
"from": 100000,
"size": 10,
"sort": [{ "timestamp": "asc" }]
}
페이지를 쉽게 이동할 수 있으나 깊은 페이지일수록 느립니다.
Scroll API
POST my_index/_search?scroll=1m
{
"size": 1000,
"sort": [
{ "timestamp": "asc" }
],
"_source": true
}
이전 페이지 한 개만 유지하는 것이 아니라, 처음 요청 이후 모든 스냅샷 데이터를 유지하므로 백업 용도가 아니면 보통 사용하지 않는다.
Search After
POST my_index/_search
{
"size": 10,
"sort": [
{ "timestamp": "asc" },
{ "_id": "asc" }
],
"search_after": [1685081830000, "doc-id-123"],
"_source": true
}
보통 대용량 검색에서 페이지네이션이 필요할 땐 Search After를 사용한다.
sort 값을 필수로 지정해줘야 하며 text 값을 sort값으로 지정할 시 field data cache값이 과도하게 할당될 수 있으므로 .keyword를 이용해서 field data caching을 피해야한다.
장애 복구(개발계)
{"statusCode":401,"error":"Unauthorized","message":"[circuit_breaking_exception] [parent] Data too large, data for [<http_request>] would be [1036689400/988.6mb], which is larger than the limit of [1020054732/972.7mb], real usage: [1036689400/988.6mb], new bytes reserved: [0/0b], usages [request=0/0b, fielddata=462101243/440.6mb, in_flight_requests=0/0b], with { bytes_wanted=1036689400 & bytes_limit=1020054732 & durability=\"PERMANENT\" }"}
개발계에서 개발하다보면 Circuit Breaker Exception을 종종 마주치곤한다.
우선 Elastic Search는 JVM의 heap 메모리를 할당하는데, 만약 개발을 위해서 1GB로 heap을 설정하는 경우 아무 것도 동작시키지 않아도 상시 40% ~ 75%을 heap 메모리가 할당되어있다.
아래의 명령어로 충분히 확인해볼 수 있다.
GET _nodes/stats/os
하지만 문제는 70%를 넘어가는 순간 Circuit Breaker Exception이 나타난다.
기본적으로 heap 사용량이 70%로 Default로 지정되어있기 때문이다.
PUT _cluster/settings
{
"persistent": {
"indices.breaker.total.limit": "95%"
}
}
위 명령어를 통해 95%로 설정해보자.
GET _cluster/settings?include_defaults=true&pretty
위 명령어를 통해 확인할 수 있다.(참고로 수동으로 퍼센테이지를 조절하기 전엔 위 API로는 노출되지 않는 값이다.)
Field Data
Search After에서 서술한 대로 Sort 값을 잘못 설정하면 Field Data가 과도하게 할당되어 Heap 메모리에 영향이 가니 아래 명령어로 확인 및 삭제를 해주는 것이 좋다.
GET _nodes/stats/indices/fielddata?pretty
POST _cache/clear?fielddata=true
아예 위의 명령어로도 접근이 안된다면 DB를 껐다켜야한다.
{
"sort": {
"_script": {
"type": "number",
"script": {
"lang": "painless",
"source": "doc['title'].value.length()"
필드데이터는 듣기만 하면 마치 굉장히 쓸모 없는 것 처럼 보여진다.
쓸모 없는게 맞긴한데, 특수한 상황에선 필드 데이터가 필요하다.
위의 코드에선 title의 길이별로 정렬하는 것인데 이럴땐 keyword로 해결이 불가능하다
이럴때 필드데이터를 활성화시켜야 제대로 정렬이 된다.
'📈 Database' 카테고리의 다른 글
[DB] Json을 RDBMS(MySQL, PostgreSQL)에 저장해도 좋을까? (1) | 2024.10.02 |
---|---|
[InnoDB Engine] 페이지란? (0) | 2024.09.12 |
MaxScale 지식 (0) | 2024.07.19 |
[Mysql] No space left on Issue 해결 (0) | 2024.06.10 |
ElasticSearch 8 Windows 설치 (0) | 2024.02.22 |