case study

๋ฒ„์ฆˆ๋‹ˆ ES ๊ฒ€์ƒ‰์—”์ง„ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ - ES(Lucene) ํ•ต์‹ฌ ๋ณ€ํ™” ๋ฆฌ์„œ์น˜

๋ฒ„์ฆˆ๋‹ˆ๋Š” ์ตœ๊ทผ์— ES 2.3.3์—์„œ 7.8.1 ๋ฒ„์ „์œผ๋กœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ง„ํ–‰ํ–ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋ฒ„์ฆˆ๋‹ˆ์—์„œ๋Š” ๊ฒ€์ƒ‰ ์‘๋‹ต ์†๋„ p99 ์ง€ํ‘œ๊ฐ€ 4์ดˆ โ†’ 0.7์ดˆ๋กœ ์•ฝ 6๋ฐฐ ํ–ฅ์ƒ๋๋‹ค. ES์˜ ๋ฒ„์ „์ด ์˜ฌ๋ผ๊ฐ€๋Š” ๊ณผ์ •์—์„œ ๋‚ด๋ถ€์ ์œผ๋กœ ๋„๋Œ€์ฒด ์–ด๋–ค ๋ณ€ํ™”๋“ค์ด ์žˆ์—ˆ๋˜ ๊ฑธ๊นŒ? ES ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ณผ์ •์—์„œ ๋ฒ„์ฆˆ๋‹ˆ๊ฐ€ ์ง„ํ–‰ํ•œ ๋ฆฌ์„œ์น˜ ๋‚ด์šฉ๋“ค์„ ๊ณต์œ ํ•œ๋‹ค.

2021.3.18(๋ชฉ)
๋ฒ„์ฆˆ๋‹ˆ ES ๊ฒ€์ƒ‰์—”์ง„ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ - ES(Lucene) ํ•ต์‹ฌ ๋ณ€ํ™” ๋ฆฌ์„œ์น˜

์ฝ์–ด๋ณด๋ฉด ์ข‹์„ ๋…์ž

โ†’ ๊ฒ€์ƒ‰์—”์ง„์œผ๋กœ ES7 ๋ฏธ๋งŒ์˜ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค.

โ†’ ES7์—์„œ ๋ฌด์–ธ๊ฐ€ ํฐ ๊ฐœ์„ ์ด ์žˆ์—ˆ๋‹ค๊ณ  ํ•˜๋Š”๋ฐ, ์ž์„ธํžˆ ์•Œ๊ณ ์‹ถ๋‹ค.


ES ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•ด๋„๋ ๊นŒ?

๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด ๊ฐœ๋ฐœ์ž ์ž…์žฅ์—์„œ ์‰ฝ๊ฒŒ ๋‚ด๋ฆด ์ˆ˜ ์žˆ๋Š” ๊ฐ„๋‹จํ•œ ๊ฒฐ์ •์€ ์•„๋‹ˆ๋‹ค. ๋ฒ„์ฆˆ๋‹ˆ์˜ ์‚ฌ๋ก€์—์„œ๋„ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ณผ์ •์—์„œ ์˜ˆ์ƒํ•˜์ง€ ๋ชปํ•œ ํฌ๊ณ  ์ž‘์€ ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ–ˆ๊ณ , ์…€ ์ˆ˜ ์—†์ด ๋งŽ์€ ๊ฐœ์„  ๊ณผ์ •์ด ํ•„์š”ํ–ˆ๋‹ค. ์ƒ‰์ธ ๋กœ์ง ๋ณ€ํ™”๋ฅผ ์ œ์™ธํ•œ ๊ฒ€์ƒ‰ ๊ด€๋ จ ์ฝ”๋“œ ๋ณ€ํ™”๋งŒ ์ตœ์†Œ 2000 Line ์ด์ƒ์ด ๋ณ€๊ฒฝ๋์œผ๋ฉฐ, ๊ณผ์ •์˜ ์žฅ์• ๋ฌผ์„ ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๋ฐฉ๋ฒ•๋“ค์„ ๋งŽ์ด ๊ณ ๋ฏผํ–ˆ๋‹ค. 


๊ฒฐ๊ณผ์ ์œผ๋กœ ES7๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ง„ํ–‰ํ–ˆ๊ณ , ๊ฒ€์ƒ‰ ์„ฑ๋Šฅ์€ ๋Œ€ํญ ํ–ฅ์ƒ ๋๋Š”๋ฐ, [ํšŒ๊ณ ] ๋ฒ„์ฆˆ๋‹ˆ์—์„œ ๊ฒ€์ƒ‰ ๋ฐฑ์—”๋“œ ์—”์ง€๋‹ˆ์–ด๋กœ ์‚ฌ๋Š” ์ด์•ผ๊ธฐ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ๋ฒ„์ฆˆ๋‹ˆ๋Š” ์ฃผ๋„์ ์œผ๋กœ ์ƒ๊ฐํ•œ ์•„์ด๋””์–ด๋“ค์„ ์‹œ๋„ํ•ด๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ถ„์œ„๊ธฐ๋ฅผ ๊ฐ–๊ณ ์žˆ์—ˆ๊ณ , ๋งค ์ˆœ๊ฐ„ ํ•ฉ๋ฆฌ์ ์ธ ์˜์‚ฌ ๊ฒฐ์ •์ด ๊ฐ€๋Šฅํ–ˆ๋‹ค. ๋•๋ถ„์— ์ค‘๊ฐ„์ค‘๊ฐ„ ๋ฐœ์ƒํ•œ ๋ฌธ์ œ๋“ค์€ ํฐ ์–ด๋ ค์›€ ์—†์ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.


โ€‹๋ฒ„์ฆˆ๋‹ˆ ๊ฒ€์ƒ‰ ์„œ๋น„์Šค ES ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ณผ์ •โ€‹


ES(Lucene)์— ์ผ์–ด๋‚œ ์ตœ๊ทผ 3๋…„์˜ ๋ณ€ํ™”

์žฅ์• ๋ฌผ์„ ๋ฌด๋ฆ…์“ฐ๊ณ ๋„ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ํ•ด์•ผ๋งŒ ํ–ˆ๋˜ ์ด์œ ๋Š” ๋ญ˜๊นŒ? ๊ฒฐ๊ณผ์ ์œผ๋กœ ์–˜๊ธฐํ•˜๋ฉด, ๋Œ€ํญ์ ์ธ ์„ฑ๋Šฅ ๊ฐœ์„ ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์ตœ๊ทผ 2~3๋…„ ์‚ฌ์ด ์˜คํ”ˆ์†Œ์Šค ES(Lucene) ์ปค๋ฎค๋‹ˆํ‹ฐ์—๋Š” ๋งŽ์€ ํ˜์‹ ์˜ ๋ฐ”๋žŒ์ด ๋ถˆ๊ณ  ์žˆ๋‹ค. 


๋Œ€ํ‘œ์ ์œผ๋กœ Block-Max-WAND๋Š” Top-K term query ๊ฒ€์ƒ‰ ์„ฑ๋Šฅ์„ ์•ฝ 3~7๋ฐฐ ๊ฐœ์„ ์‹œ์ผฐ๊ณ , ์ƒ‰์ธ ๋™์‹œ์„ฑ ๊ฐœ์„ ์€ ์ƒ‰์ธ ์„ฑ๋Šฅ์˜ 7~8๋ฐฐ ๊ฐœ์„ ์„ ๋งŒ๋“ค์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  FST offheap์„ ํ†ตํ•œ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ๊ฐœ์„ , rank_feature ๊ธฐ๋Šฅ ์ถ”๊ฐ€, Indexing custom term frequencies ๋„์ž…๋“ฑ์˜ ์ฃผ์š” ๋ณ€ํ™”๋“ค์ด ์žˆ์—ˆ๋‹ค. 


์ด๋Ÿฐ ๋ณ€ํ™”๋Š” Lucene ์ปค๋ฎค๋‹ˆํ‹ฐ์— ์ž์ฃผ ์žˆ์–ด์™”๋˜ ์ผ์ด ์•„๋‹ˆ๋‹ค. ์œ ๋ž˜์—†๋Š” ๋ณ€ํ™”๋“ค์ด ์ตœ๊ทผ 3๋…„ ์‚ฌ์ด์— ์ผ์–ด๋‚ฌ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ES7 ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.


์•„๋งˆ์กด์ด ๋‚ด๋ถ€ ๊ฒ€์ƒ‰์—”์ง„์œผ๋กœ Lucene ์‚ฌ์šฉ์„ ๊ฒฐ์ •ํ•˜๋‹ค

์ด ๋ณ€ํ™”์˜ ๋ฐฐ๊ฒฝ์— ์žˆ๋Š” ์ค‘์š”ํ•œ ์‚ฌ์‹ค์€, 2019๋…„ ์•„๋งˆ์กด์ด ๋‚ด๋ถ€ ๊ฒ€์ƒ‰์—”์ง„์œผ๋กœ Lucene์„ ์ „๊ฒฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค๋Š” ์‚ฌ์‹ค์ด ์žˆ๋‹ค.


์•„๋งˆ์กด์€ 2017๋…„ ์˜คํ”ˆ์†Œ์Šค Lucene์˜ ํ•ต์‹ฌ ๊ฐœ๋ฐœ์ž์ด๋ฉฐ Lucene in Action์˜ ์ €์ž์ธ McCandless๋ฅผ ์˜์ž…ํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ตœ๊ทผ์— ์•„๋งˆ์กด์˜ ์ฒœ์žฌ ๊ฐœ๋ฐœ์ž์ด๋ฉฐ, Lucene ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ PMC Chair๋ฅผ ๋งก๊ฒŒ๋œ Michael Sokolov๋Š” ANN(Approximate nearest vector search) ๊ธฐ๋Šฅ์„ Lucene์— ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ์œ„ํ•ด ๊ณ ๊ตฐ๋ถ„ํˆฌ ํ–ˆ๋‹ค. 


์„ธ๊ณ„ ์ตœ๊ณ ์˜ ์ปค๋จธ์Šค ํšŒ์‚ฌ์ธ ์•„๋งˆ์กด์ด ๋‚ด๋ถ€ ๊ฒ€์ƒ‰์—”์ง„์œผ๋กœ Lucene์„ ์„ ํƒํ–ˆ๊ณ , Lucene์˜ ํ•ต์‹ฌ ์—”์ง€๋‹ˆ์–ด๋“ค์„ ์˜์ž…ํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ง€๊ธˆ ์ด ์ˆœ๊ฐ„ ๋‹ค์–‘ํ•œ ๊ธฐ์—ฌ๋ฅผ ๋งŒ๋“ค๊ณ  ์žˆ๋‹ค. ์ตœ์‹ ์˜ ES(Lucene)๋ฅผ ์ ๊ทน ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, ์šฐ๋ฆฌ๋Š” ์Šน์ฐจ๊ฐ ์ข‹์€ ์•„๋งˆ์กด ๋ฒ„์Šค์— ํƒ‘์Šนํ•  ์ˆ˜ ์žˆ๋‹ค. follow ํ•˜์ง€ ์•Š์„ ์ด์œ ๊ฐ€ ์žˆ์„๊นŒ? 


๋งŒ์ผ ๊ธฐ์ˆ ๋ถ€์ฑ„๋กœ ์˜ค๋žซ๋™์•ˆ ๋ฐฉ์น˜๋˜์–ด ์žˆ๋Š” ES๊ฐ€ ๋ˆˆ์•ž์— ๋ณด์ธ๋‹ค๋ฉด, ํ˜์‹ ์ ์ธ ๋ณ€ํ™”๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๊ธฐ์— ์ข‹์€ ๊ธฐํšŒ๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.


ES (Lucene)์˜ ํ•ต์‹ฌ ๋ณ€ํ™”


Block-Max-WAND (LUCENE-8135, Adrien Grand, @Elastic)

์šฐ๋ฆฌ๊ฐ€ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” Should query๋Š” Must query์— ๋น„ํ•ด score ๊ณ„์‚ฐ ๋Œ€์ƒ์˜ ์ˆ˜๊ฐ€ ์›”๋“ฑํžˆ ๋งŽ๋‹ค. ์ด๋Š” ๊ฒ€์ƒ‰ ์„ฑ๋Šฅ ์ €ํ•˜์˜ ํฐ ์›์ธ์ด ๋œ๋‹ค. 


Adrien Grand๋Š” 2012๋…„์˜ MAXSCORE, 2017๋…„์˜ WAND๋ฅผ ์ง€๋‚˜ ๊ฒฐ๊ตญ 2019๋…„์— Block-Max-WAND ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ–ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์œผ๋กœ ์ธํ•ด, ๊ณ„์‚ฐ์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒ€์ƒ‰ ๋Œ€์ƒ๋“ค์„ ๋น ๋ฅด๊ฒŒ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๊ณ , Top-k ๊ฒ€์ƒ‰์˜ ์†๋„๊ฐ€ ๋งค์šฐ ํฌ๊ฒŒ ๊ฐœ์„ ๋๋‹ค. 


๋งŒ์•ฝ ์„œ๋น„์Šค ์š”๊ตฌ์‚ฌํ•ญ์—์„œ ์ „์ฒด ์ƒํ’ˆ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•  ํ•„์š”๊ฐ€ ์—†๊ณ  ๋žญํ‚น ์Šคํฌ๋ฆฝํŠธ๋“ฑ์œผ๋กœ customํ•˜๊ฒŒ score๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋ฉด, Block-Max-WAND ๊ธฐ๋Šฅ์€ ๊ฒ€์ƒ‰ ์„ฑ๋Šฅ ๊ฐœ์„ ์— ๋งค์šฐ ํฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋‹ค.


FeatureField(rank_feature) (LUCENE-8197, Adrien Grand, @Elastic)

โ€˜์ข‹์•„์š”โ€™๊ฐ€ ๋งŽ์ด ๋‹ฌ๋ฆฐ ๊ธ€์˜ ๊ฒ€์ƒ‰ ๋žญํ‚น์„ ๋†’์ด๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ, ์ข‹์•„์š” field์— ์ƒ‰์ธ๋œ ๊ฐ’์„ ์ ์ˆ˜ ๊ณ„์‚ฐ์— ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ์š”๊ตฌ์‚ฌํ•ญ์„ ์œ„ํ•ด ES๋Š” ๋žญํ‚น ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ œ๊ณตํ•ด์™”๋Š”๋ฐ, ๋žญํ‚น ์Šคํฌ๋ฆฝํŠธ๋Š” ์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ๋ชจ๋“  ๋Œ€์ƒ ๋ฌธ์„œ๋ฅผ ์ง์ ‘ ์ˆœํšŒํ•˜๋ฉฐ score๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ๋”ฐ๋ผ์„œ ๊ณ„์‚ฐ ๋น„์šฉ์ด ๋งค์šฐ ๋น„์‹ธ๊ณ , ์„ฑ๋Šฅ ์ตœ์ ํ™”๊ฐ€ ์–ด๋ ต๋‹ค. 


๋ฒ„์ฆˆ๋‹ˆ์˜ ์‚ฌ๋ก€์—์„œ๋Š” ๊ณผ๊ฑฐ ES2์˜ groovy ranking script๊ฐ€ ๋งค์šฐ ํฐ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ์˜ ์›์ธ์ค‘ ํ•˜๋‚˜์˜€๊ณ , painless๋กœ ๊ฐœ์„ ๋˜๋ฉด์„œ ๊ทธ๋‚˜๋งˆ ์„ฑ๋Šฅ์ด ๋งŽ์ด ๊ฐœ์„ ๋๋‹ค. ๊ทธ๋Ÿฐ๋ฐ, rank_feature ๊ธฐ๋Šฅ ์ถ”๊ฐ€๋กœ ์ธํ•ด, ๋žญํ‚น ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์—†์ด field์— ์ƒ‰์ธ๋œ ๊ฐ’์„ ์ ์ˆ˜ ๊ณ„์‚ฐ์— ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ์ด ๊ธฐ๋Šฅ์€ Block-Max-WAND ์ตœ์ ํ™”์— ๊ธ์ •์ ์ธ ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค.


Lazy loading Lucene FST offheap using mmap (LUCENE-8635, Ankit Jain, @Amazon)

Lucene์—์„œ FST๋Š” ํž™๋ฉ”๋ชจ๋ฆฌ์—์„œ ๊ด€๋ฆฌ๋ผ ์™”๋‹ค. ์•„๋งˆ์กด์—์„œ ์ผํ•˜๊ณ  ์žˆ๋Š” Ankit Jain์€ FST๋ฅผ memory-mapped IO๋กœ lazy load ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐœ์„ ์„ ์‹œ๋„ํ–ˆ๋‹ค. ์ด ๊ฐœ์„ ์œผ๋กœ ํ•ซ ์ธ๋ฑ์Šค์—์„œ ์„ฑ๋Šฅ ์ €ํ•˜ ์—†์ด ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ํฌ๊ฒŒ ๊ฐ์†Œํ–ˆ๋‹ค. Elastic์˜ 10TB ์ธ๋ฑ์Šค ํ…Œ์ŠคํŠธ ๋ฒค์น˜๋งˆํฌ์—์„œ ๊ธฐ์กด 17GB์˜€๋˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด 2.5GB๋กœ ์•ฝ 7๋ฐฐ ๊ฐ€๊นŒ์ด ๊ฐœ์„ ๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์คฌ๋‹ค.


Indexing custom term frequencies (LUCENE-7854, Michael McCandless, @Amazon)

Lucene์˜ ํ•ต์‹ฌ ๊ฐœ๋ฐœ์ž Michael McCandless๊ฐ€ ์•„๋งˆ์กด์— ์ž…์‚ฌํ•˜๊ณ  ๋ฐ”๋กœ ๊ฐœ์„ ํ•œ ์ด์Šˆ์ธ๋ฐ, ์ˆ˜์ • ๋‚ด์šฉ์„ ๋ณด๋ฉด ๊ต‰์žฅํžˆ ์ธ์ƒ์ ์ด๋‹ค. Lucene ๊ฒ€์ƒ‰์—”์ง„์€ ๋‚ด๋ถ€์ ์œผ๋กœ ๊ฒ€์ƒ‰ score์˜ ๊ณ„์‚ฐ์„ ์œ„ํ•ด TF(term frequencies - ๊ฒ€์ƒ‰ ๋‹จ์–ด์˜ ๋“ฑ์žฅ ํšŸ์ˆ˜)๋ฅผ ํ™œ์šฉํ•œ๋‹ค. 


๊ทธ๋Ÿฐ๋ฐ, ์ด๋ฒˆ ์ˆ˜์ •์—์„œ term frequency ๊ฐ’์„ ์ƒ‰์ธ ์‹œ์ ์— customํ•˜๊ฒŒ ์ž„์˜์˜ ๊ฐ’(vector)์„ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณ€๊ฒฝํ–ˆ๋‹ค(์ด๋กœ ์ธํ•ด, ๊ฒฐ๊ณผ์ ์œผ๋กœ TermFrequency๋Š” ๋”์ด์ƒ "๋‹จ์–ด์˜ ๋“ฑ์žฅ ํšŸ์ˆ˜: term frequency"๊ฐ€ ์•„๋‹ˆ๊ฒŒ ๋˜์—ˆ๋‹ค..!). ์ด ๋ณ€ํ™”๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์•ž์„œ ๋ณด์•˜๋˜ FeatureField, vector search๋“ฑ์˜ ๊ธฐ๋Šฅ ์ถ”๊ฐ€๊ฐ€ ์ด๋ค„์กŒ๊ณ , ๋จธ์‹ ๋Ÿฌ๋‹ ํ•™์Šต๋œ ๋ชจ๋ธ์„ Lucene์—์„œ ์‚ฌ์šฉํ• ๋•Œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํš๊ธฐ์ ์ธ ์ดˆ์„์ด ๋๋‹ค.


Use multiple threads to apply deletes and DV updates (LUCENE-7868, Michael McCandless, @Amazon)

์ด ์ด์Šˆ ์—ญ์‹œ ์•„๋งˆ์กด์˜ Michael McCandless๊ฐ€ ๊ฐœ์„ ํ–ˆ๋‹ค. ๊ธฐ์กด์˜ Lucene์—์„œ ๋ฌธ์„œ๋ฅผ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜, ๋ฌธ์„œ์˜ ๊ฐ’์„ ์—…๋ฐ์ดํŠธ ํ• ๋•Œ ํฐ ๋ณ‘๋ชฉ์ด ๋ฐœ์ƒํ–ˆ์—ˆ๋‹ค. ๋‹จ์ˆœํžˆ ์ƒˆ๋กœ์šด ๊ธ€์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋กœ๊น…์˜ ์šฉ๋„์—์„œ๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์ง€๋งŒ, ์ง€์†์ ์œผ๋กœ ๋ฌธ์„œ๋ฅผ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ด ๋ถ€๋ถ„์ด ์ฃผ์š” ๋ณ‘๋ชฉ ํฌ์ธํŠธ์˜€๋‹ค. 


ํŠนํžˆ, ์•„๋งˆ์กด๊ณผ ๋ฒ„์ฆˆ๋‹ˆ ๊ฐ™์ด ์ƒํ’ˆ์„ ์ƒ‰์ธํ•ด์•ผ ํ•˜๋Š” ์ปค๋จธ์Šค ์„œ๋น„์Šค์˜ ๊ฒฝ์šฐ, ์ƒํ’ˆ์˜ ๋ณ€๊ฒฝ์ด ๋นˆ๋ฒˆํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ณ‘๋ชฉ์— ์˜ํ–ฅ์ด ํฌ๋‹ค. Michael McCandless๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด delete์™€ doc value update๊ฐ€ multiple threads๋กœ ์ด๋ฃจ์–ด์ง€๋„๋ก ๊ฐœ์„ ํ–ˆ๊ณ , doc values ์—…๋ฐ์ดํŠธ ์†๋„๊ฐ€ 7~8๋ฐฐ๋กœ ๋Œ€ํญ ํ–ฅ์ƒ๋๋‹ค.


Approximate nearest vector search (Lucene-9004, Michael Sokolov, @Amazon)

์•„๋งˆ์กด์€ ES(Lucene)์— ANN์„ ํšจ๊ณผ์ ์œผ๋กœ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ๊ณ , Michael Sokolov๋ผ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•ต์‹ฌ์ ์ธ ๊ธฐ์—ฌ๋ฅผ ํ•˜๊ณ  ์žˆ๋‹ค. ๋‹ค์–‘ํ•œ ANN ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘ state-of-art๋กœ ์•Œ๋ ค์ง„ nmslib์˜ HNSW(Hierarchical Navigable Small World graphs)๋ฅผ Lucene์— ์ ์šฉํ•˜๋Š” ์ผ์„ ์ตœ๊ทผ์— ์ง„ํ–‰ํ–ˆ๊ณ , ์ด ๊ธฐ๋Šฅ์€ Lucene 9.0์— ๋“ค์–ด๊ฐˆ ์˜ˆ์ •์ด๋‹ค. 


ES์™€ Lucene๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๋‹ค์–‘ํ•œ ์˜์—ญ์—์„œ ANN์ด ์ถ”๊ฐ€๋˜๋Š” ๊ฒƒ์„ ๊ธฐ๋Œ€ํ•˜๊ณ  ์žˆ๋‹ค. ์•„๋งˆ์กด์ด ์•ž์œผ๋กœ ANN์„ ํ†ตํ•ด ๊ฒ€์ƒ‰ ์„œ๋น„์Šค์— ์–ด๋–ค ๋ณ€ํ™”๋“ค์„ ๋งŒ๋“ค์–ด ๋‚˜๊ฐˆ์ง€๋„ ๊ธฐ๋Œ€๋˜๋Š” ๋ถ€๋ถ„์ด๋‹ค.


 ๋ฒ„์ฆˆ๋‹ˆ๋Š” ์ด๋ฏธ์ง€ ๊ฒ€์ƒ‰ ๋“ฑ vector space search์—์„œ nmslib(HNSW)๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค. nmslib(HNSW)์—๋Š” ๋ฌธ์„œ ์‚ญ์ œ, ๊ฒฐ๊ณผ ํ•„ํ„ฐ๋ง, ๊ฐ€์ค‘์น˜ ๊ณ„์‚ฐ ๋“ฑ ํ•ด๊ฒฐ์ด ์‰ฝ์ง€ ์•Š์€ ๋‹ค์–‘ํ•œ ํ•œ๊ณ„๊ฐ€ ์—ฌ์ „ํžˆ ์กด์žฌํ•˜๋Š”๋ฐ, Michael Sokolov์€ Lucene์— ๋„์ž…ํ•˜๋ฉด์„œ ๊ทธ๋Ÿฐ ๋ถ€๋ถ„๋“ค๋„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ๋‹ค.


๊ด€๋ จ๋ฌธ์„œ

๋ฒ„์ฆˆ๋‹ˆ
ํ™ˆ์‡ผํ•‘๋ชจ์•„
์Šคํƒ€ํŠธ์—…
๋ฐฑ์—”๋“œ ์—”์ง€๋‹ˆ์–ด
๊ฒ€์ƒ‰ ์„œ๋น„์Šค
ES7
ES ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜
๊ฒ€์ƒ‰์—”์ง„
buzzni
pr@buzzni.com