Elasticsearch์์ term ์ฟผ๋ฆฌ๊ฐ ๋์ํ์ง ์๋ ๋ฌธ์ ํด๊ฒฐ
๋ฌธ์ ์ํฉ
์ฑ์ฉ ๊ณต๊ณ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ๊ธฐ๋ฅ์ Spring API์ Elasticsearch๋ฅผ ์ฐ๋ํ์ฌ ๊ตฌํํ๋ ์ค, ์๊ฒฉ ์๊ฑด(requiredSkills)์ term ์ฟผ๋ฆฌ๋ฅผ ํตํด ํํฐ๋งํ๋๋ ๋ฐ์ดํฐ๊ฐ ์ ํ ์กฐํ๋์ง ์๋ ํ์์ด ๋ฐ์ํ๋ค.
๊ธฐ์กด ์ฟผ๋ฆฌ
// ์๊ฒฉ ์๊ฑด ํํฐ๋ง
if (requestDto.getRequiredSkill() != null) {
boolQueryBuilder.filter(f -> f
.term(t -> t
.field("requiredSkills")
.value(requestDto.getRequiredSkill())
)
);
}
์์ธ ๋ถ์
๋จผ์ Elasticsearch์์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ํ์ธํด ๋ดค๋ค.
GET job-opening/_mapping
ํ์ธ ๊ฒฐ๊ณผ requiredSkills ํ๋์ ๋งคํ์ด ๋ค์๊ณผ ๊ฐ์ด ์ค์ ๋์ด ์์๋ค.
"requiredSkills": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
์ฌ๊ธฐ์ ์ค์ํ ๊ฒ์ term ์ฟผ๋ฆฌ๋ ์ ํํ ์ผ์นํ๋ ํค์๋๋ฅผ ๊ฒ์ํ๋ ๋ฐฉ์์ด๊ธฐ ๋๋ฌธ์ analyzer๊ฐ ์ ์ฉ๋๋ text ํ์ ํ๋์์ ์ ๋๋ก ๋์ํ์ง ์๋ ๊ฒ์ด๋ค.
- text ํ์ : analyzer๋ฅผ ํตํด ๋จ์ด๊ฐ ๋ถ๋ฆฌ๋์ด ์ ์ฅ๋จ (์ ํํ ์ผ์น ๊ฒ์ ๋ถ๊ฐ)
- keyword ํ์ : analyzer ์์ด ์ ํํ ํค์๋ ํํ๋ก ์ ์ฅ๋จ (์ ํํ ์ผ์น ๊ฒ์ ๊ฐ๋ฅ)
ํด๊ฒฐ ๋ฐฉ๋ฒ
์ ํํ ํค์๋ ๋งค์นญ์ ์ํด์๋ ๋ฐ๋์ .keyword ํ๋๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
์์ ํ ์ฟผ๋ฆฌ
// ์๊ฒฉ ์๊ฑด ํํฐ๋ง
if (requestDto.getRequiredSkill() != null) {
boolQueryBuilder.filter(f -> f
.term(t -> t
.field("requiredSkills.keyword")
.value(requestDto.getRequiredSkill())
)
);
}
๊ฒฐ๊ณผ ํ์ธ
์ฟผ๋ฆฌ๋ฅผ ์์ ํ ํ ๋ค์ ํ ์คํธํ๋๋ ์ ์์ ์ผ๋ก ๋ฐ์ดํฐ๊ฐ ์กฐํ๋๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค.
์ฃผ์ํ ์
- Elasticsearch์์ ์ ํํ ์ผ์นํ๋ ํค์๋๋ก ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ๋ ํญ์ keyword ํ์ ์ ์ฌ์ฉํ์.
- term ์ฟผ๋ฆฌ๋ analyzer๊ฐ ์ ์ฉ๋์ง ์์ ํ๋(keyword)์์๋ง ์ ํํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค.