๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Elasticsearch5

[๊ธฐ๋Šฅ ๊ฐœ์„ ] ์ž๋™ ์™„์„ฑ + ๋ถ€๋ถ„ ๊ฒ€์ƒ‰, ๊ฐ™์ด ์“ฐ๋ฉด ์•ˆ ๋˜๋Š” ์ด์œ  (feat. Nori ์ ์šฉ) ๐Ÿ” ํ•œ๊ธ€ ํ˜•ํƒœ์†Œ ๋ถ„์„๊ธฐ๋กœ ๊ฒ€์ƒ‰ ์ •ํ™•๋„ ๊ฐœ์„ ํ•˜๊ธฐ: Nori + ์ž๋™์™„์„ฑ ๋ถ„๋ฆฌ ์ „๋žต   ๐Ÿ’ญ ๋ฌธ์ œ ์ธ์‹ ๊ธฐ์กด์—๋Š” ์ฑ„์šฉ ๊ณต๊ณ  ๊ฒ€์ƒ‰์— ๋ถ€๋ถ„ ๊ฒ€์ƒ‰(N-gram)๊ณผ ์ž๋™ ์™„์„ฑ(Edge N-gram) ๊ธฐ๋Šฅ์„ ํ•จ๊ป˜ ์ ์šฉํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.๊ธฐ๋ณธ์ ์ธ ๊ฒ€์ƒ‰์€ ๊ฐ€๋Šฅํ–ˆ์ง€๋งŒ, ์‚ฌ์šฉ์ž๊ฐ€ ๊ธฐ๋Œ€ํ•˜๋Š” ์ •ํ™•ํ•œ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ข…์ข… ๋ฐœ์ƒํ–ˆ๋‹ค. ๐Ÿ“Œ ์˜ˆ์‹œ์‚ฌ์šฉ์ž๊ฐ€ "์นด๋“œ"๋ผ๋Š” ๋‹จ์–ด๋ฅผ ํฌํ•จํ•œ ์ฑ„์šฉ ๊ณต๊ณ ๋ฅผ ์ฐพ๊ณ  ์‹ถ์„ ๋•Œ, ์ž๋™ ์™„์„ฑ ๊ธฐ๋Šฅ์ด ํ•จ๊ป˜ ๋™์ž‘ํ•˜๋ฉด์„œ์นด๋กœ ์‹œ์ž‘ํ•˜๋Š” ์ „ํ˜€ ๋‹ค๋ฅธ ์ฑ„์šฉ ๊ณต๊ณ ๋“ค๊นŒ์ง€ ํ•จ๊ป˜ ๊ฒ€์ƒ‰๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.๊ฒฐ๊ณผ์ ์œผ๋กœ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ณด๋‹ค ๋„ˆ๋ฌด ๋งŽ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•จ๊ป˜ ๋…ธ์ถœ๋˜๋ฉด์„œ ์‚ฌ์šฉ์ž๋Š” ์ •ํ™•ํ•œ ๊ฒ€์ƒ‰์ด ์–ด๋ ต๋‹ค๋Š” ์ธ์ƒ์„ ๋ฐ›๊ฒŒ ๋˜์—ˆ๋‹ค.  ๐Ÿงฑ ๊ธฐ์กด ์ธ๋ฑ์Šค ๊ตฌ์กฐ์˜ ํ•œ๊ณ„ ๊ธฐ์กด ์ธ๋ฑ์Šค ์„ค์ •์—์„œ๋Š” title, requiredSkills.. 2025. 4. 3.
[๊ธฐ๋Šฅ ๊ฐœ์„ ] ์ฑ„์šฉ ๊ณต๊ณ  ๊ฒ€์ƒ‰ ์†๋„ 48ms โ†’ 14ms, ์–ด๋–ป๊ฒŒ ๊ฐ€๋Šฅํ–ˆ์„๊นŒ? ๐Ÿš€ QueryDSL์—์„œ Elasticsearch๋กœ, ์ฑ„์šฉ ๊ณต๊ณ  ์กฐํšŒ ์„ฑ๋Šฅ ๊ฐœ์„    ๐Ÿ’ญ ๋ฌธ์ œ ์ธ์‹ ์ฒ˜์Œ์—๋Š” MySQL + QueryDSL ๊ธฐ๋ฐ˜์œผ๋กœ ์ฑ„์šฉ ๊ณต๊ณ ๋ฅผ ์กฐํšŒํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.๋‹จ์ˆœ ์กฐํšŒ ์„ฑ๋Šฅ ์ž์ฒด๋Š” ๋น„๊ต์  ๋น ๋ฅธ ํŽธ์ด์—ˆ๋‹ค.ํ•˜์ง€๋งŒ ์„œ๋น„์Šค๊ฐ€ ์„ฑ์žฅํ•˜๋ฉด์„œ ๋ถ€๋ถ„ ๊ฒ€์ƒ‰์ด๋‚˜ ์ž๋™ ์™„์„ฑ ๋“ฑ ๊ฒ€์ƒ‰ ํŽธ์˜ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•ด์•ผ ํ•  ํ•„์š”์„ฑ์ด ์ปค์กŒ๊ณ , ์ด๋ฅผ QueryDSL๋งŒ์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ์—” ๊ตฌ์กฐ์  ํ•œ๊ณ„๊ฐ€ ์žˆ์—ˆ๋‹ค.ํŠนํžˆ ์ „์ฒด ์ฑ„์šฉ ๊ณต๊ณ ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ‚ค์›Œ๋“œ ๊ธฐ๋ฐ˜ ๊ฒ€์ƒ‰์ด๋‚˜ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์— ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ˜์‘ํ•˜๋Š” ๊ธฐ๋Šฅ์€ Elastisearch๊ฐ€ ๋” ์ ํ•ฉํ•œ ๊ธฐ์ˆ ์ด๋ผ๊ณ  ํŒ๋‹จํ–ˆ๋‹ค. ๐Ÿ” Elasticsearch ๋„์ž… ๋ฐฐ๊ฒฝ์ฑ„์šฉ ๊ณต๊ณ  ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์„ ๋‹จ์ˆœ ํ‚ค์›Œ๋“œ ์กฐํšŒ์— ๊ทธ์น˜์ง€ ์•Š๊ณ  ๋ถ€๋ถ„ ๊ฒ€์ƒ‰, ์ž๋™ ์™„์„ฑ ๋“ฑ ๊ฒ€์ƒ‰ ํŽธ์˜ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•  ํ•„์š”๊ฐ€ ์žˆ์—ˆ๋‹ค.ํ•˜์ง€๋งŒ MyS.. 2025. 4. 3.
[ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…] @Setting์„ ์ผ๋Š”๋ฐ ์™œ ์ธ๋ฑ์Šค๊ฐ€ ์•ˆ ๋ ๊นŒ? ๐Ÿงจ Elasticsearch ์ธ๋ฑ์Šค ์„ค์ •์ด ์•ˆ ๋œ๋‹ค?! @Setting ์‹คํŒจ ๊ธฐ๋ก  ๐Ÿ’ฅ๋ฌธ์ œ ์ƒํ™ฉSpring Boot + Spring Data Elasticsearch ํ™˜๊ฒฝ์—์„œElasticsearch์—์„œ ๊ฒ€์ƒ‰ ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ์œ„ํ•ด n-gram, edge-ngram ๊ธฐ๋ฐ˜ ์ธ๋ฑ์Šค ์„ค์ •์„ ์ ์šฉํ•˜๋ ค๊ณ  ํ–ˆ๋‹ค.์•„๋ž˜์™€ ๊ฐ™์ด job-opening-settings.json์„ ์ž‘์„ฑํ•˜๊ณ ,Spring Data Elasticsearch์˜ @Setting ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ์ž๋™์œผ๋กœ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ ค๊ณ  ํ–ˆ๋‹ค.๋”๋ณด๊ธฐ  job-opening-settings.json { "settings": { "analysis": { "filter": { "ngram_filter": { "type": "ng.. 2025. 4. 2.
[ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… ] Elasticsearch ์ธ๋ฑ์Šค ์‚ฝ์ž… ๋ฐ ์กฐํšŒ ์‹คํŒจ ๋ฌธ์ œ ํ•ด๊ฒฐ๊ธฐ (์ธ๋ฑ์Šค, ๋งคํ•‘, ID ์ค‘๋ณต) Elasticsearch ๋ฐ์ดํ„ฐ ์‚ฝ์ž… ๋ฐ ์กฐํšŒ ๋ฌธ์ œ ํ•ด๊ฒฐ ๊ณผ์ • Elasticsearch์— CSV ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ  ์กฐํšŒํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์กฐํšŒ๋˜์ง€ ์•Š์•„ ์›์ธ์„ ๋ถ„์„ํ•˜๊ณ  ํ•ด๊ฒฐํ–ˆ๋˜ ๊ณผ์ •์„ ์ •๋ฆฌํ•ด ๋ดค๋‹ค.๋ฐœ์ƒํ•œ ๋ฌธ์ œ์™€ ์›์ธ ๋ถ„์„1.  ์ธ๋ฑ์Šค ๋„ค์ด๋ฐ ๋ถˆ์ผ์น˜ ๋ฌธ์ œ๋ฌธ์ œ ์ƒํ™ฉElasticsearch์—์„œ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋Š” "job-opening"์œผ๋กœ ์„ค์ •ํ–ˆ์ง€๋งŒ, ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ๋•Œ๋Š” "job_opening"์œผ๋กœ ์กฐํšŒํ•˜๋Š” ์‹ค์ˆ˜๋ฅผ ๋ฒ”ํ–ˆ๋‹ค.Kibana์—์„œ ์กฐํšŒ ์‹œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์•˜๋‹ค.ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ์ธ๋ฑ์Šค๋ช…์„ ์ƒ์ˆ˜(static final)๋กœ ์ •์˜ํ•˜์—ฌ, ์ƒ์„ฑ๊ณผ ์กฐํšŒ ์‹œ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ–ˆ๋‹ค.public static final String INDEX_NAME = "job-opening"; 2. ๋™์  ๋งคํ•‘(@Postconstr.. 2025. 2. 25.
[ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… ] Elasticsearch keyword ํ•„๋“œ์˜ ์ค‘์š”์„ฑ (term ์ฟผ๋ฆฌ๊ฐ€ ์•ˆ๋  ๋•Œ) Elasticsearch์—์„œ term ์ฟผ๋ฆฌ๊ฐ€ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฌธ์ œ ์ƒํ™ฉ์ฑ„์šฉ ๊ณต๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ๊ธฐ๋Šฅ์„ Spring API์™€ Elasticsearch๋ฅผ ์—ฐ๋™ํ•˜์—ฌ ๊ตฌํ˜„ํ•˜๋˜ ์ค‘, ์ž๊ฒฉ ์š”๊ฑด(requiredSkills)์„ term ์ฟผ๋ฆฌ๋ฅผ ํ†ตํ•ด ํ•„ํ„ฐ๋งํ–ˆ๋”๋‹ˆ ๋ฐ์ดํ„ฐ๊ฐ€ ์ „ํ˜€ ์กฐํšŒ๋˜์ง€ ์•Š๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ–ˆ๋‹ค.๊ธฐ์กด ์ฟผ๋ฆฌ// ์ž๊ฒฉ ์š”๊ฑด ํ•„ํ„ฐ๋งif (requestDto.getRequiredSkill() != null) { boolQueryBuilder.filter(f -> f .term(t -> t .field("requiredSkills") .value(requestDto.getRequiredSkill()) ) );}์›์ธ ๋ถ„์„๋จผ์ € Ela.. 2025. 2. 25.