DB/Elasticsearch

07. Elasticsearch - scroll 검색

akatjd 2022. 7. 25. 18:59

지속 서비스가 아닌 한시적 연구과제 중 엘라스틱 데이터 검색시 1만개 이상을 조회해야하는 상황 발생.

 

환경설정 window 설정 늘려서 더 큰 수량의 데이터 조회가 가능하지만 당연히 ES에서도 비추하고 시스템 부하로 잘못하면 index에 영향이 갈 수 있음.

 

실제 호기심에 몇십만 데이터 호출을 해봤는데 ES가 작업하는 양이 많은 상태에서 해당 무리한 요구까지 하니 index가 뻗어 버림..

 

당황했지만 다행히 원상복구 됨..

 

이후 scroll 검색 적용해봄. (Cursor 같은 기능)

 

ex

GET /product_info/_search?scroll=10m
{
	"size" : 10,
	"query" : {
		"term" : {
			"categorySeq" : 1
		}
	}
}

 

 

위처럼 product_info를 scroll과 size 속성을 넣고 쿼리 조회를 할 시 먼저 조회되는 10개의 데이터와 scroll_id 값 등을 리턴해준다.

 

ex

{
	_scroll_id:DnF1ZXJ5VGhlbkZldGNoAgAAAAAAAGLvFlQ2ZldFT3NvUzhha1ZrMm5RZjlITHcAAAAAAABi8BZUNmZXRU9zb1M4YWtWazJuUWY5SEx3,
	took:16,
	timed_out:false,
	_shards:{
		total:2,
		successful:2,
		skipped:0,
		failed:0
	},
	hits:{
		total:187456,
		max_score:1.0,
		hits:[{
			_index:issue-v0.1.3,
			_type:doc,
			_id:131544,
			_score:1.0,
			_source:{
				productCode : KAFC121
			}
		},{
			_index:issue-v0.1.3,
			_type:doc,
			_id:184522,
			_score:1.0,
			_source:{
				productCode : KAFC122
			}
		},...,{
			_index:issue-v0.1.3,
			_type:doc,
			_id:8953,
			_score:1.0,
			_source:{
				productCode : KAFC129
			}
		},{
			_index:issue-v0.1.3,
			_type:doc,
			_id:8955,
			_score:1.0,
			_source:{
				productCode : KAFC130
			}
		}
	]}
}

 

그 후 scroll_id를 넣어 다음과 같이 재조회를 하면 이전에 조회되었던 10개의 데이터 이후 10개의 데이터가 조회된다.

 

GET /_search/scroll 
{
	"scroll" : "10m"
	"_scroll_id" : "DnF1ZXJ5VGhlbkZldGNoAgAAAAAAAGLvFlQ2ZldFT3NvUzhha1ZrMm5RZjlITHcAAAAAAABi8BZUNmZXRU9zb1M4YWtWazJuUWY5SEx3"
}

 

계속 반복을 해주면 새로운 hits 데이터들이 조회되고 되고 끝에는 hits가 null로 조회되며 끝까지 조회가 가능하다.

 

10m은 해당 scroll의 지속 시간이며, 먼저 끝날시에는 해당 스크롤을 삭제해줘야 한다. (메모리를 꽤나 차지한다고 한다.)

 

ex

DELETE /_search/scroll 
{
	"_scroll_id" : "DnF1ZXJ5VGhlbkZldGNoAgAAAAAAAGLvFlQ2ZldFT3NvUzhha1ZrMm5RZjlITHcAAAAAAABi8BZUNmZXRU9zb1M4YWtWazJuUWY5SEx3"
}

 

이를 자신이 사용하는 언어에 맞게 만들어주면 된다.

 

java로 해당 scroll 조회를 완료해봤지만 원하는 만큼의 퍼포먼스가 나오지 않아 bucket 등의 개념을 추가로 생각해봐야겠다.