๐ ์ถ์ฒ/์ ํ๋/์ต์ /์ธ๊ธฐ์ ๋ถ๋ฆฌ ์ ๋ต
Elasticsearch์์ ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ํ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋ ์ ๋ต์ ์ ๋ฆฌํ ๋ฌธ์์ ๋๋ค.
์ฌ์ฉ์์ ๋์ฆ์ ๋ฐ๋ผ ์ ํ๋, ์ธ๊ธฐ, ์ต์ , ์ถ์ฒ์์ ๋ถ๋ฆฌํ์ฌ ๊ฒ์ ํ์ง์ ๋์ผ ์ ์์ต๋๋ค.
1. ๐ฏ ์ ํ๋ ์ ๋ ฌ (Relevance Based)
์ ๋ต
multi_match
์ฟผ๋ฆฌ๋ก ๋ค์ํ ํ๋ ๊ฒ์- ์ค์ํ ํ๋์๋
boost
์ ์ฉ
{
"multi_match": {
"query": "์นด์นด์ค",
"fields": ["title^3", "content", "tags^2"],
"type": "best_fields"
}
}
title
ํ๋๋^3
โ ๊ฐ์ฅ ๋์ ์ ์ ๊ธฐ์ฌtags
๋^2
โ ์ค๊ฐ ๊ฐ์ค์น
2. ๐ฅ ์ธ๊ธฐ์ ์ ๋ ฌ (Popularity Based)
์ ๋ต
likes
,clicks
๋ฑ์ ์์น ํ๋๋ฅผ ์ ์์ ๋ฐ์function_score
+field_value_factor
์ฌ์ฉ
{
"function_score": {
"query": {
"match": {
"title": "์นด์นด์ค"
}
},
"functions": [
{
"field_value_factor": {
"field": "likes",
"factor": 1.5,
"modifier": "sqrt",
"missing": 0
}
},
{
"field_value_factor": {
"field": "clicks",
"factor": 0.5,
"modifier": "log1p",
"missing": 1
}
}
],
"score_mode": "sum",
"boost_mode": "replace"
}
}
3. ๐ ์ต์ ์ ์ ๋ ฌ (Latest First)
์ ๋ต
createdAt
ํ๋๋ก ์ ๋ ฌ
{
"sort": [
{ "createdAt": { "order": "desc" } }
]
}
- ์ต์ ๋ฌธ์๊ฐ ๋จผ์ ๋ ธ์ถ๋จ
- relevance ์ ์๋ ๋ฌด์๋จ
4. ๐ง ์ถ์ฒ์ ์ ๋ ฌ (Recommendation Ranking)
์ ๋ต
- ์ ํ๋ ร ์ธ๊ธฐ ร ์ต์ ์ฑ ์กฐํฉ
function_score
๋ก ํตํฉ ์ ์ ๊ณ์ฐ
{
"function_score": {
"query": {
"multi_match": {
"query": "์นด์นด์ค",
"fields": ["title^3", "content", "tags^2"]
}
},
"functions": [
{
"field_value_factor": {
"field": "likes",
"factor": 1.2,
"modifier": "sqrt"
}
},
{
"gauss": {
"createdAt": {
"origin": "now",
"scale": "10d",
"decay": 0.5
}
}
}
],
"score_mode": "sum",
"boost_mode": "multiply"
}
}
- ์ ํ๋๋ ๊ธฐ๋ณธ
_score
likes
: ์ธ๊ธฐ ์ ์gauss(createdAt)
: ์ต์ ์ฑ ์ ์multiply
๋ก ๊ฒฐํฉ โ ์ถ์ฒ์
โ ์์ฝ ์ ๋ฆฌ
์ ๋ ฌ ๊ธฐ์ค | ์ ๋ต ์์ฝ |
---|---|
์ ํ๋์ | multi_match + boost |
์ธ๊ธฐ์ | function_score + likes , clicks |
์ต์ ์ | sort by createdAt desc |
์ถ์ฒ์ | ์ ํ๋ ร ์ธ๊ธฐ ร ์ต์ ์ฑ ์กฐํฉ (function_score ) |