scout

Scout

Eloquent ๋ชจ๋ธ์— ๋Œ€ํ•ด full-text ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์„ ์žฅ์ฐฉ ํ•  ์ˆ˜ ์žˆ๋Š” ๋“œ๋ผ์ด๋ฒ„ ๊ธฐ๋ฐ˜์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋ชจ๋ธ ์˜ต์ €๋ฒ„๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์—˜๋กœํ€€ํŠธ ๋ ˆ์ฝ”๋“œ์™€ ๋™๊ธฐํ™”ํ•˜์—ฌ ๊ฒ€์ƒ‰ ์ธ๋ฑ์Šค๋ฅผ ์ž๋™์œผ๋กœ ์œ ์ง€ํ•œ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ Aloglia๋“œ๋ผ์ด๋ฒ„๋ฅผ ๋‚ด์žฅํ•˜๋ฉฐ, ๋‹ค๋ฅธ ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์ด์šฉํ•˜๊ฑฐ๋‚˜ ์ปค์Šคํ…€ ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฒ€์ƒ‰ ๋ฐฉ๋ฒ•

  1. MySQL์˜ ํ•„๋“œ์— ๋Œ€ํ•ด like %~%๊ตฌ๋ฌธ์„ ํ†ตํ•ด ์ ์ ˆํ•œ ๋‹จ์–ด๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ธฐ

  2. MySQL์˜ full-text ์—”์ง„ ์ด์šฉํ•˜๊ธฐ

  3. Scout๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•ด์„œ full-text ๊ฒ€์ƒ‰์—”์ง„ ์ด์šฉํ•˜๊ธฐ

1.์˜ ๋ฐฉ๋ฒ•์€ ํ•„๋“œ๊ฐ€ ๋งŽ์„ ์ˆ˜๋ก, content๊ฐ€ ๊ธธ ์ˆ˜๋ก ๊ฒ€์ƒ‰ ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ์†Œ์š”๋˜๋ฉฐ 2๋ฒˆ์˜ ๋ฐฉ๋ฒ•์€ Eloquent๋ชจ๋ธ๊ณผ ๋™๊ธฐํ™”๊ฐ€ ํž˜๋“ค๋ฉฐ ์ฟผ๋ฆฌ๋ฌธ์„ ์ž‘์„ฑํ•ด์•ผํ•จ

๋”ฐ๋ผ์„œ ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—๋Š” 3๋ฒˆ์˜ ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•˜๊ธฐ๋กœ ํ•จ!

๊ฒ€์ƒ‰ ์—”์ง„ ๋“œ๋ผ์ด๋ฒ„

  1. Algolia Scout์˜ ๊ธฐ๋ณธ ๋“œ๋ผ์ด๋ฒ„์ด์ง€๋งŒ, ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜์˜ ๊ฒ€์ƒ‰์—”์ง„์œผ๋กœ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด ํšŒ์›๊ฐ€์ž…๊ณผ ์•ฑ์—์„œ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•œ ์ ‘์†์ด ํ•„์š”ํ•˜๊ณ  ์š”๊ธˆ์ œ์ด๋‹ค. => ๋ˆ๋„ ๋ˆ์ด์ง€๋งŒ VDI๋‚ด๋ถ€์—์„œ ์™ธ๋ถ€์ ‘์†์ด ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜๋ ค

  2. Elastic Search ์œ ๋ช…ํ•œ ๊ฒ€์ƒ‰์—”์ง„์ด๋ฉฐ ๋…ธ๋ฆฌ๋ผ๋Š” ํ•œ๊ธ€ ํ˜•ํƒœ์†Œ ๋ถ„์„๊ธฐ๋ฅผ ๊ธฐ๋ณธ ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ๋‚ด์žฅ๋˜์–ด ์žˆ์–ด ํ•œ๊ธ€์„ ์ €์žฅํ•˜๊ณ  ๋ถ„์„/ํƒ์ƒ‰ํ•˜๋Š”๋ฐ๋„ ์ ํ•ฉ

    ๊ถŒ์žฅ ์‚ฌ์–‘์ด ์ตœ์†Œ 2core์ด์ƒ์˜ cpu์— ram 4gb์ด์ƒ์ด ํ•„์š”ํ•˜๋ฉฐ ์ด๋Š” ์ตœ์†Œ ์‚ฌ์–‘์ด๊ณ  ๋ณดํ†ต ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ์™€ ๋ฐ์ดํ„ฐ ๋…ธ๋“œ/ ํด๋ผ์ด์–ธํŠธ ๋…ธ๋“œ ๋“ฑ์œผ๋กœ ๋‚˜๋ˆ„์–ด ๊ตฌ์„ฑํ•˜๋Š”๋ฐ ์ด๋Š” ํ˜„์žฌ ํ™˜๊ฒฝ๊ณผ ๊ธฐ๊ฐ„๋‚ด์—๋Š” ๋น ๋“ฏ ํ•  ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ ๊ณผ์ŠคํŽ™์ด๋ผ๊ณ  ํŒ๋‹จํ•˜์—ฌ ์ œ์™ธ

    ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ

    ์ธ๋ฑ์Šค์˜ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ, ์ƒค๋“œ(์ƒ‰์ธ์„ ์กฐ๊ฐ์œผ๋กœ ๋ถ„ํ• )์˜ ์œ„์น˜์™€ ๊ฐ™์€ ํด๋Ÿฌ์Šคํ„ฐ ใ……์ƒํƒœ ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ•  ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ํด๋Ÿฌ์Šคํ„ฐ๋งˆ๋‹ค ํ•˜๋‚˜์˜ ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•˜๊ณ  ์ด ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋…ธ๋“œ๊ฐ€ ์—†๋‹ค๋ฉด ์ž‘๋™์ด ์ •์ง€

    ๋ฐ์ดํ„ฐ ๋…ธ๋“œ

    ์‹ค์ œ๋กœ ์ƒ‰์ธ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š” ๋…ธ๋“œ๋กœ ๋งˆ์Šคํ„ฐ๋…ธ๋“œ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๋ถ„๋ฆฌํ•˜์—ฌ ์„œ๋กœ ๊ฐ์ž์˜ ์—ญํ• ์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ถ„๋ฆฌํ•˜๋Š”๊ฒŒ ์ผ๋ฐ˜์ 

  3. Meili Search ์˜คํ”ˆ ์†Œ์Šค FTS๋กœ Rust๋กœ ๋งŒ๋“ค์–ด์ ธ ๋ณ„๋„์˜ ์˜์กด์„ฑ ์—†์ด ๊ฐ„๋‹จํ•œ ์„ค์ •์œผ๋กœ ๊ฒ€์ƒ‰์—”์ง„ ์„œ๋ฒ„ ์„ค์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

ํ•œ๊ธ€ ํ˜•ํƒœ์†Œ ์‚ฌ์ „์ด ํƒ‘์žฌ๋˜์ง€ ์•Š์•„์„œ ํ•œ๊ธ€ ๊ฒ€์ƒ‰ ํ’ˆ์งˆ์€ ๋‚ฎ๋‹ค.

VDI๋‚ด๋ถ€๋กœ ์„ค์น˜ํŒŒ์ผ์„ ๊ฐ€์ง€๊ณ ๊ฐ€์„œ ์„ค์น˜ ํ›„ ๋“ฑ๋กํ•ด ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฉฐ ๊ธฐ๋ณธ DB์‚ฌ์ด์ฆˆ๋ฅผ 100gb๋ฅผ ์žก๊ธฐ ๋•Œ๋ฌธ์— size์„ค์ •์„ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

  1. TNT Search ์˜คํ”ˆ์†Œ์Šค FTS๋กœ PHP๋กœ ๋งŒ๋“ค์–ด์กŒ๋‹ค. ์„œ๋ฒ„์— ๋ณ„๋‹ค๋ฅธ ๊ฒ€์ƒ‰์—”์ง„์„œ๋ฒ„ ์„ค์น˜ ์—†์ด laravel์— ์˜์กด์„ฑ๋งŒ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ( php7, php pdo extension, sqlite extension, mbstring extension, laravel5.6 ์ด์ƒ )

์ œ๊ณต ๊ธฐ๋Šฅ - ํผ์ง€ ๊ฒ€์ƒ‰ (๋น„์Šทํ•œ ๋‹จ์–ด ๊ฒ€์ƒ‰) - ํ…์ŠคํŠธ ๋ถ„๋ฅ˜ - ํ˜•ํƒœ์†Œ ๋ถ„์„ - ์‚ฌ์šฉ์ž ์ •์˜ ํ† ํฌ๋‚˜์ด์ € - bool ๊ฒ€์ƒ‰

TNTSearch๊ฐ€ ์ ์šฉ๋„ ๊ฐ„๋‹จํ•˜๋ฉฐ ๊ฒ€์ƒ‰์—”์ง„์€ commit์ด 3๊ฐœ์›”, scout driver๋Š” 2๊ฐœ์›” ์ „ ๊ธฐ๋ก์œผ๋กœ ๋น„๊ต์  ์ตœ์‹ ๊นŒ์ง€ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋˜์–ด ์žˆ์–ด ์šฐ์„  TNT Search๋ฅผ ์ด์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ์„ค๊ณ„ํ•  ๊ณ„ํš

tntsearch driver๋งŒ ์„ค์น˜ํ•˜๋ฉด ๋ณ„๋„์˜ scout์˜์กด์„ฑ์€ ์ถ”๊ฐ€ํ•ด์ฃผ์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

1. ์ธ๋ฑ์Šค ํŒŒ์ผ ์ƒ์„ฑ

์ธ๋ฑ์Šค ํŒŒ์ผ์€ ๋‚ด๋ถ€์ ์œผ๋กœ SQLite๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค. (์ž์„ธํ•œ ์„ค๋ช…์ด ์•ˆ๋‚˜์™€์žˆ์–ด ์ถ”์ธก์ด๋‹ค.)

์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ด์šฉํ•ด ์„ค์ •ํŒŒ์ผ๋กœ DB์— ์ง์ ‘ ์ ‘์†ํ•ด ์ธ๋ฑ์Šค ํŒŒ์ผ์„ ๋งŒ๋“ค๊ฑฐ๋‚˜, scout ๊ณต์‹๋ฌธ์„œ์— ์„ค๋ช…ํ•œ๋Œ€๋กœ ๋น„์–ด์žˆ๋Š” ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ฉด storage/ ๋ฐ‘์— *.index๋กœ ์ƒ์„ฑ์ด๋œ๋‹ค.

2. ๊ฒ€์ƒ‰

scout๋ฅผ ์ด์šฉํ•˜๋ฉด search()๋ฅผ ์ด์šฉํ•˜๋ฉด ์‰ฝ๊ฒŒ ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ ๊ฒ€์ƒ‰์ˆ˜ํ–‰์‹œ ์ธ๋ฑ์Šค ํŒŒ์ผ ๋‚ด์—์„œ ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ๋“ค์„ ์ฐพ๊ณ  DB ํ–‰์˜ ๊ธฐ๋ณธํ‚ค ๋ชจ์Œ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๊ทธ ํ›„ get()๋ฉ”์„œ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ๊ธฐ๋ณธํ‚ค๋“ค์„ ๋ฐ”ํƒ•์œผ๋กœ select ~ where in()์ ˆ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ๊ฐ’์˜ ์ •๋ณด๋ฅผ ์กฐํšŒํ•œ๋‹ค. Collection์œผ๋กœ ๋ฐ˜ํ™˜๋˜๋Š” ๊ฒƒ.

๋ฌธ์ œ์  | ํ•ด๊ฒฐํ•ด์•ผ ํ•  ์ 

์ด ํ”„๋กœ์ ํŠธ๋„ ํ•œ๊ธ€ ํ˜•ํƒœ์†Œ ๋ถ„์„๊ธฐ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์•„ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์ •ํ™•๋„๊ฐ€ ๋–จ์–ด์งˆ ์ˆ˜๋„ ์žˆ๋‹ค.

๋ณ„๋„์˜ ํ•œ๊ธ€ ํ˜•ํƒœ์†Œ ๋ถ„์„๊ธฐ์ค‘ ์˜คํ”ˆ์†Œ์Šค์ธ ์€์ „ํ•œ ๋‹ข(mecab)์„ ์ด์šฉํ•ด์„œ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ํ›„์— ์ƒ๊ฐํ•ด๋ณด์ž. => elasticsearch๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์„ฑ๋Šฅ์ด ๋” ์ข‹์„ ์ˆ˜๋„?

Last updated