๋ฒ์ฆ๋ ES ๊ฒ์์์ง ๋ง์ด๊ทธ๋ ์ด์ - ES(Lucene) ํต์ฌ ๋ณํ ๋ฆฌ์์น
๋ฒ์ฆ๋๋ ์ต๊ทผ์ ES 2.3.3์์ 7.8.1 ๋ฒ์ ์ผ๋ก์ ๋ง์ด๊ทธ๋ ์ด์ ์ ์งํํ๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ฒ์ฆ๋์์๋ ๊ฒ์ ์๋ต ์๋ p99 ์งํ๊ฐ 4์ด โ 0.7์ด๋ก ์ฝ 6๋ฐฐ ํฅ์๋๋ค. ES์ ๋ฒ์ ์ด ์ฌ๋ผ๊ฐ๋ ๊ณผ์ ์์ ๋ด๋ถ์ ์ผ๋ก ๋๋์ฒด ์ด๋ค ๋ณํ๋ค์ด ์์๋ ๊ฑธ๊น? ES ๋ง์ด๊ทธ๋ ์ด์ ๊ณผ์ ์์ ๋ฒ์ฆ๋๊ฐ ์งํํ ๋ฆฌ์์น ๋ด์ฉ๋ค์ ๊ณต์ ํ๋ค.

์ฝ์ด๋ณด๋ฉด ์ข์ ๋
์
โ ๊ฒ์์์ง์ผ๋ก ES7 ๋ฏธ๋ง์ ๋ฒ์ ์ ์ฌ์ฉํ๊ณ ์๋ค.
โ ES7์์ ๋ฌด์ธ๊ฐ ํฐ ๊ฐ์ ์ด ์์๋ค๊ณ ํ๋๋ฐ, ์์ธํ ์๊ณ ์ถ๋ค.
ES ๋ง์ด๊ทธ๋ ์ด์ ํด๋๋ ๊น?
๋ง์ด๊ทธ๋ ์ด์ ์ด ๊ฐ๋ฐ์ ์ ์ฅ์์ ์ฝ๊ฒ ๋ด๋ฆด ์ ์๋ ๊ฐ๋จํ ๊ฒฐ์ ์ ์๋๋ค. ๋ฒ์ฆ๋์ ์ฌ๋ก์์๋ ๋ง์ด๊ทธ๋ ์ด์ ๊ณผ์ ์์ ์์ํ์ง ๋ชปํ ํฌ๊ณ ์์ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ๊ณ , ์ ์ ์์ด ๋ง์ ๊ฐ์ ๊ณผ์ ์ด ํ์ํ๋ค. ์์ธ ๋ก์ง ๋ณํ๋ฅผ ์ ์ธํ ๊ฒ์ ๊ด๋ จ ์ฝ๋ ๋ณํ๋ง ์ต์ 2000 Line ์ด์์ด ๋ณ๊ฒฝ๋์ผ๋ฉฐ, ๊ณผ์ ์ ์ฅ์ ๋ฌผ์ ์ด๋ป๊ฒ ๊ด๋ฆฌํด์ผ ํ๋์ง์ ๋ํ ๋ฐฉ๋ฒ๋ค์ ๋ง์ด ๊ณ ๋ฏผํ๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก ES7๋ก ๋ง์ด๊ทธ๋ ์ด์ ์ ์งํํ๊ณ , ๊ฒ์ ์ฑ๋ฅ์ ๋ํญ ํฅ์ ๋๋๋ฐ, [ํ๊ณ ] ๋ฒ์ฆ๋์์ ๊ฒ์ ๋ฐฑ์๋ ์์ง๋์ด๋ก ์ฌ๋ ์ด์ผ๊ธฐ์์ ๋ณผ ์ ์๋ฏ์ด ๋ฒ์ฆ๋๋ ์ฃผ๋์ ์ผ๋ก ์๊ฐํ ์์ด๋์ด๋ค์ ์๋ํด๋ณผ ์ ์๋ ๋ถ์๊ธฐ๋ฅผ ๊ฐ๊ณ ์์๊ณ , ๋งค ์๊ฐ ํฉ๋ฆฌ์ ์ธ ์์ฌ ๊ฒฐ์ ์ด ๊ฐ๋ฅํ๋ค. ๋๋ถ์ ์ค๊ฐ์ค๊ฐ ๋ฐ์ํ ๋ฌธ์ ๋ค์ ํฐ ์ด๋ ค์ ์์ด ํด๊ฒฐํ ์ ์์๋ค.
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)์ ํต์ฌ ๋ณํ
(Lucene 7.0) Use multiple threads to apply deletes and DV updates
(์ถ์ ์์ , Lucene 9.0) Approximate nearest vector search
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 ๊ธฐ๋ฅ์ ๊ฒ์ ์ฑ๋ฅ ๊ฐ์ ์ ๋งค์ฐ ํฐ ๋์์ด ๋ ์ ์๋ค.
[Buzzni TechShare] - 20200417_์ฐฐ๋ฆฌ_ES7_๊ฒ์_๋ฆฌ์์น (v0.1)
[๋ฒ์ญ] Magic WAND: Faster Retrieval of Top Hits in Elasticsearch
FeatureField(rank_feature) (LUCENE-8197, Adrien Grand, @Elastic)
โ์ข์์โ๊ฐ ๋ง์ด ๋ฌ๋ฆฐ ๊ธ์ ๊ฒ์ ๋ญํน์ ๋์ด๊ณ ์ถ์ ๊ฒฝ์ฐ, ์ข์์ field์ ์์ธ๋ ๊ฐ์ ์ ์ ๊ณ์ฐ์ ํ์ฉํ ์ ์๋ค. ์ด ์๊ตฌ์ฌํญ์ ์ํด ES๋ ๋ญํน ์คํฌ๋ฆฝํธ๋ฅผ ์ ๊ณตํด์๋๋ฐ, ๋ญํน ์คํฌ๋ฆฝํธ๋ ์คํฌ๋ฆฝํธ ์์ง์ด ๋ชจ๋ ๋์ ๋ฌธ์๋ฅผ ์ง์ ์ํํ๋ฉฐ score๋ฅผ ๊ณ์ฐํ๋ ๋ฐฉ์์ด๋ค. ๋ฐ๋ผ์ ๊ณ์ฐ ๋น์ฉ์ด ๋งค์ฐ ๋น์ธ๊ณ , ์ฑ๋ฅ ์ต์ ํ๊ฐ ์ด๋ ต๋ค.
๋ฒ์ฆ๋์ ์ฌ๋ก์์๋ ๊ณผ๊ฑฐ ES2์ groovy ranking script๊ฐ ๋งค์ฐ ํฐ ์ฑ๋ฅ ๋ณ๋ชฉ์ ์์ธ์ค ํ๋์๊ณ , painless๋ก ๊ฐ์ ๋๋ฉด์ ๊ทธ๋๋ง ์ฑ๋ฅ์ด ๋ง์ด ๊ฐ์ ๋๋ค. ๊ทธ๋ฐ๋ฐ, rank_feature ๊ธฐ๋ฅ ์ถ๊ฐ๋ก ์ธํด, ๋ญํน ์คํฌ๋ฆฝํธ๊ฐ ์์ด field์ ์์ธ๋ ๊ฐ์ ์ ์ ๊ณ์ฐ์ ํ์ฉํ ์ ์๊ฒ ๋๋ค. ๊ฒ๋ค๊ฐ ์ด ๊ธฐ๋ฅ์ Block-Max-WAND ์ต์ ํ์ ๊ธ์ ์ ์ธ ์ํฅ์ ๋ฐ๋๋ค.
[Buzzni TechShare] - 20200522_์ฐฐ๋ฆฌ_ES7_๊ฒ์_๋ฆฌ์์น (v0.2)
[Buzzni TechShare] - 20200619_์ฐฐ๋ฆฌ_ES7_๊ฒ์_๋ฆฌ์์น (v0.3)
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๋ฐฐ ๊ฐ๊น์ด ๊ฐ์ ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์คฌ๋ค.
[์๋ง์กด ๊ณต์ ๋ธ๋ก๊ทธ] - What Amazon gets by giving back to Apache Lucene
[Elastic ๊ณต์ ๋ธ๋ก๊ทธ] - Significantly decrease your Elasticsearch heap memory usage
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์์ ์ฌ์ฉํ ๋ ํ์ฉํ ์ ์๋ ํ๊ธฐ์ ์ธ ์ด์์ด ๋๋ค.
[Buzzni TechShare] - 20200619_์ฐฐ๋ฆฌ_ES7_๊ฒ์_๋ฆฌ์์น (v0.3)
[์๋ง์กด ๊ณต์ ๋ธ๋ก๊ทธ] - What Amazon gets by giving back to Apache 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์ ๋์ ํ๋ฉด์ ๊ทธ๋ฐ ๋ถ๋ถ๋ค๋ ํด๊ฒฐํ๊ธฐ ์ํด ๋ ธ๋ ฅํ๊ณ ์๋ค.
๊ด๋ จ๋ฌธ์
[ํ๊ณ ] ๋ฒ์ฆ๋์์ ๊ฒ์ ๋ฐฑ์๋ ์์ง๋์ด๋ก ์ฌ๋ ์ด์ผ๊ธฐ
[Buzzni TechShare] - 20200417_์ฐฐ๋ฆฌ_ES7_๊ฒ์_๋ฆฌ์์น (v0.1)
[Buzzni TechShare] - 20200522_์ฐฐ๋ฆฌ_ES7_๊ฒ์_๋ฆฌ์์น (v0.2)
[Buzzni TechShare] - 20200619_์ฐฐ๋ฆฌ_ES7_๊ฒ์_๋ฆฌ์์น (v0.3)
[Buzzni TechShare] - 20210208_์ฐฐ๋ฆฌ_vector_similarity_search_with_elasticsearch (v1.2)
[๋ฒ์ญ] Magic WAND: Faster Retrieval of Top Hits in Elasticsearch
[์๋ง์กด ๊ณต์ ๋ธ๋ก๊ทธ] - What Amazon gets by giving back to Apache Lucene
[Elastic ๊ณต์ ๋ธ๋ก๊ทธ] - Significantly decrease your Elasticsearch heap memory usage
