๐ฅ๏ธ ์ต์ข ํ๋ก์ ํธ/๐ ๏ธ ํธ๋ฌ๋ธ์ํ 4 [ํธ๋ฌ๋ธ์ํ ] N-gram๊ณผ Edge-Ngram์ ํจ๊ป ์ผ๋๋? ๊ฒ์ ์ ํ๋ ๋ฌธ์ ์ ํด๊ฒฐ ๊ณผ์ ๐ฅ ์์์น ๋ชปํ ๊ฒ์ ๊ฒฐ๊ณผ? N-gram + Edge-Ngram์ด ๋ง๋ ๋ฌธ์ ๐ ๋ฐ์ํ ๋ฌธ์ ์ฒ์์๋ ๊ฒ์ ๊ธฐ๋ฅ์ ๊ฐํํ๊ธฐ ์ํด ๋ถ๋ถ ๊ฒ์(N-gram)๊ณผ ์๋ ์์ฑ(Edge-Ngram) ๋ ๊ธฐ๋ฅ์ ๋์์ Elasticsearch์ ์ ์ฉํ๋ค.๊ฒ์์ด๊ฐ ์ค๊ฐ์ ํฌํจ๋ ๋จ์ด๋ ์ฐพ๊ณ , ๋์์ ์ ๋ ฅํ ๊ธ์์ ์๋ถ๋ถ์ผ๋ก ์๋ ์์ฑ๊น์ง ๋๋๋ก ํ ๊ฒ์ด์๋ค.ํ์ง๋ง... ์ค์ ๊ฒ์์์ ์์ํ์ง ๋ชปํ ๊ฒฐ๊ณผ๊ฐ ๋ฑ์ฅํ๊ธฐ ์์ํ๋ค. ๐ ์์ 1) ๊ฒ์์ด: ๋ฏธ๋ ธ ๋ฏธ๋ ธ๊ฐ ํฌํจ๋ ์ ํํ ๋จ์ด๋ฅผ ์ฐพ๊ณ ์ถ์์ง๋ง,N-gram๊ณผ Edge-Ngram์ด ํจ๊ป ์ ์ฉ๋ ํ๋๊ฐ ์กฐํ ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ค์ด๋๋ค.๊ฒฐ๊ณผ์ ์ผ๋ก ๊ด๋ จ ์๋ ํค์๋๊น์ง ํฌํจ๋ ๊ฒฐ๊ณผ๊ฐ ๋ ธ์ถ๋์๋ค. ๐ ์์ 2) ๊ฒ์์ด: ์นด๋์นด๋๋ฅผ ๊ฒ์ํ์ ๋, ์นด๋์ ๋ฌด๊ดํ ์นด๋ก ์์ํ๋ ๋จ์ด.. 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. ์ด์ 1 ๋ค์