์ด ๋ฌธ์๋ Elasticsearch์์ ์ถ์ฒ์ ์ ๋ ฌ์ ์ํด ์ ์(score)๋ฅผ ์ํ์ ์ผ๋ก ์ค๊ณํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช
ํฉ๋๋ค.
BM25
์ ์์ ์ฌ์ฉ์ ํ๋ ๋ฐ์ดํฐ(likes
, clicks
) ๊ทธ๋ฆฌ๊ณ ์ต์ ์ฑ
์ ์กฐํฉํ์ฌ ์ถ์ฒ ์ ์๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
โ
๋ชฉํ ์ ์ ๊ณต์
์ต์ข
์ ์ = BM25 ร ์ธ๊ธฐ ์ ์ + ์ต์ ์ฑ ์ ์
- BM25: Elasticsearch ๊ธฐ๋ณธ ๊ฒ์ ์ ์
- ์ธ๊ธฐ ์ ์:
likes
, clicks
๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ณ์ฐ - ์ต์ ์ฑ ์ ์:
createdAt
ํ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก decay ์ ์ฉ
1. ๐ฏ BM25 (๊ธฐ๋ณธ ์ ์)
- ๊ธฐ๋ณธ์ ์ผ๋ก
match
, multi_match
์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ BM25 ์ ์๊ฐ ์๋ ๊ณ์ฐ๋ฉ๋๋ค. - ์ ํ๋ ๊ธฐ๋ฐ ๊ฒ์์ ์ฌ์ฉ๋ฉ๋๋ค.
{
"multi_match": {
"query": "์นด์นด์ค",
"fields": ["title^3", "content", "tags^2"]
}
}
2. ๐ ์ธ๊ธฐ ์ ์ ์์ (log1p, sqrt)
{
"field_value_factor": {
"field": "likes",
"factor": 1.2,
"modifier": "sqrt",
"missing": 0
}
},
{
"field_value_factor": {
"field": "clicks",
"factor": 0.8,
"modifier": "log1p",
"missing": 1
}
}
sqrt
: ์ข์์ ์์ ์ฆ๊ฐํญ์ ์ํlog1p
: ํด๋ฆญ ์๊ฐ ๋ง์๋ ์๋งํ๊ฒ ์ ์ ์ฆ๊ฐ
3. ๐ ์ต์ ์ฑ ์ ์ (decay ํจ์)
{
"gauss": {
"createdAt": {
"origin": "now",
"scale": "10d",
"decay": 0.4
}
}
}
createdAt
๊ธฐ์ค์ผ๋ก ์ ์ ๊ฐ์- ์ต์ ๋ฌธ์์ผ์๋ก ์ ์๊ฐ ๋๊ณ ์ค๋๋ ๋ฌธ์๋ ๋ฎ์์ง
4. โ๏ธ score_mode / boost_mode ์ค์
ํญ๋ชฉ | ์ค๋ช
|
---|
score_mode | ์ฌ๋ฌ function ์ ์๋ฅผ ์ด๋ป๊ฒ ๊ฒฐํฉํ ์ง (sum, avg ๋ฑ) |
boost_mode | ๊ธฐ์กด _score ์ function ๊ฒฐ๊ณผ ๊ฒฐํฉ ๋ฐฉ์ |
์ถ์ฒ ๊ณต์์ ๋ง๋ ์ค์
"score_mode": "sum",
"boost_mode": "multiply"
- ์ ์ ํจ์๋ผ๋ฆฌ๋
sum
- ๊ทธ ๊ฒฐ๊ณผ๋ฅผ BM25
_score
์ ร
(multiply)
5. ๐งช ์ ์ฒด ์์ ์ฟผ๋ฆฌ
{
"query": {
"function_score": {
"query": {
"multi_match": {
"query": "์นด์นด์ค",
"fields": ["title^3", "content", "tags^2"]
}
},
"functions": [
{
"field_value_factor": {
"field": "likes",
"factor": 1.2,
"modifier": "sqrt",
"missing": 0
}
},
{
"field_value_factor": {
"field": "clicks",
"factor": 0.8,
"modifier": "log1p",
"missing": 1
}
},
{
"gauss": {
"createdAt": {
"origin": "now",
"scale": "10d",
"decay": 0.4
}
}
}
],
"score_mode": "sum",
"boost_mode": "multiply"
}
}
}
โ
์ ๋ฆฌ
์์ | ์ค๋ช
|
---|
BM25 | ๊ธฐ๋ณธ ํ
์คํธ ๋งค์นญ ์ ์ |
์ธ๊ธฐ ์ ์ | likes , clicks โ sqrt, log1p ์ ์ฉ |
์ต์ ์ฑ ์ ์ | createdAt โ decay ์ ์ฉ |
์ต์ข
์กฐํฉ | score_mode: sum , boost_mode: multiply |