흠.. script를 사용해서 elasticsearch 쿼리문을 날려야하는 경우가 생겼는데, 역시나… 성능에 너무나도 문제가 생겨버렸다 ㅜㅜ
index docs.count | warmup-time-period | target-throughput |
---|---|---|
4,035,321 | 5 | 1000 |
GET test_index/_search
{
"script_fields": {
"field1": {
"script": {
"lang": "painless",
"source": "params['_source']['field1'].findAll(i -> i.x == 'y')"
}
},
"field2": {
"script": {
"source": "(doc['field3'].value * params.page_view_weight + doc['field4'].value * params.field4_weight",
"params": {"field3_weight": 10, "field4_weight": 20}
}
}
},
"query": {
"bool": {
"must": [
{
"terms": {
"_index": [
"test_index"
]
}
}
],
"filter": {
"bool": {
"must": [
{
"term": {
"field10": False
}
},
{
"term": {
"field11": True
}
}
]
}
}
}
},
"_source": [
"test_field1",
"test_field2",
"test_field3"
],
"sort": {
"_script": {
"type": "number",
"script": {
"source": "(doc['field3'].value * params.page_view_weight + doc['field4'].value * params.field4_weight",
"params": {"field3_weight": 10, "field4_weight": 20}
},
"order": "asc"
}
},
"size": 100,
"from": 0
}
clients | sort | 처리량 | cpu 사용량 | 에러률 | |
---|---|---|---|---|---|
1 | 1000 | O | 평균 처리량 : X ops/s /대기시간 포함한 처리시간 : X ms / 대기시간을 포함하지 않은 처리시간 : X ms | 100% | 100% |
2 | 1 | O | 평균 처리량 : 2.0 ops/s / 대기시간 포함한 처리시간 : 59189.79 ms / 대기시간을 포함하지 않은 처리시간 : 509.36 ms | 6% | 0% |
3 | 1000 | X | 평균 처리량 : 985.56 ops/s / 대기시간 포함한 처리시간 : 449.26 ms / 대기시간을 포함하지 않은 처리시간 : 430.04 ms | 17.5% | 0% |
⇒ 설명 ⭐
sort에서 script를 사용하는 것은 굉장한 성능저하를 일으킨다! 다른 방법을 생각해보는 것을 권장한다.